Pre-launch · built and tested
Shared treasury
Keep project SOL in a treasury with three fixed owners, where any payment needs two of them to sign the same transaction.
- Approvals2 of 3 owners
- Ownersfixed forever
- VEYDUCT fee0.01 SOL to create
- HoldsSOL only
With your wallet
Manage a shared treasury
Load a treasury, prepare a payment, and collect the second owner’s signature. Review a creation, deposit or payment now.
Connect and load
The treasury’s own address (not an owner’s wallet), from whoever created it. Loading reads its owners and balance from mainnet; nothing is signed.
No wallet connected.
What happens next: Connect shares only your public address. Load fills in the owners and the second-owner list in step 2.
Create or fund a treasury
The connected wallet becomes owner one and pays for creation, including the one-time 0.01 SOL VEYDUCT fee. All three owners are fixed permanently and can’t be rotated, so double-check them.
Each co-owner’s own wallet address: three different wallets, yours included. Ask each person to copy it from their wallet. Owners can never be changed.
Any whole number, like 1. It is part of the treasury’s address, so a new number gives the same owners a separate treasury. The review shows the address and the 0.01 SOL fee before you sign.
SOL to send in, like 0.5. Anyone can deposit; only two owners together can take it out.
Prepare a payment
Cosign a request
The first owner signs and exports the request. The second owner pastes it here, reviews it against the live treasury, then adds their signature. An expired blockhash needs a new review and both signatures. Never paste a private key or seed phrase.
What happens next: Inspect locally reads the file in your browser without any network. Review against mainnet checks it against the live treasury before you add your signature.
Practice run · simulated · nothing is sent
Practice run
The practice run loads with the page. It needs JavaScript; nothing is signed or sent.
How it works in depth
Everything the treasury program does, and does not do
Written from the program source (programs/tenure-treasury) and the page’s own code. Amounts are in SOL; 1 SOL is 1,000,000,000 The smallest unit of SOL. 1 SOL = 1,000,000,000 lamports; a network fee of 5,000 lamports is 0.000005 SOL..
- Approvals
- 2 of 3 owners, signing the same transaction
- Owners
- Fixed at creation. They can never change
- VEYDUCT fee
- 0.01 SOL to create a treasury. Nothing else
- Holds
- SOL only
Accounts
The whole treasury is one account. Its address is derived from fixed seeds (a Program-derived address: an address worked out from fixed words and inputs, with no private key. Only the program can sign for it, so nobody can swap in a look-alike.), so the page can find it from owner one and the seed number, and nobody can swap in a look-alike.
Treasury
Holds the SOL and records the three owners, the seed number and the A counter in the treasury. Each payment must name its current value, and it rises by one after every payment, so an old request can never run again. (how many payments it has made).
- Seeds
- "tenure-treasury", owner one, seed number
- Size
- 128 bytes
- Created by
- Owner one
Payment request
Not an account: a transaction owner one signs and exports as a public cosign file. It contains signatures, never keys.
- Fixes
- Recipient, amount, nonce, deadline, both signers
- Lives
- Until its blockhash or deadline expires
Deposits
Plain SOL transfers into the treasury address. Anyone can send them, even before the treasury is created.
- Instruction
- System Program transfer
- Program fee
- None
Who can do what
- ActionWho signsRules the program enforces
- CreateOwner one, who also paysExactly three different, valid wallet addresses. The address must match owner one and the seed number.
- DepositAnyoneAn ordinary SOL transfer. Only a payment can take it out again.
- PayAny two different owners, in one transactionAmount above zero, the current nonce, before the deadline slot, to an address that is not the treasury, leaving the full rent reserve.
- Change ownersNobodyNo instruction exists to add, remove or rotate an owner.
- Pay alone, pause or closeNobodyNo single-owner withdrawal, no admin, no VEYDUCT control, no close instruction.
The owners you type at creation are permanent. Check every address before you approve: a wrong or lost owner can never be replaced.
A payment, step by step
The program checks one rule set for every payment. These are the exact checks, in the order it runs them:
- Two different owners signed
signer one ≠ signer two, both in the owner listThe page names the second owner when you prepare; only that owner’s signature completes the transaction. - The nonce matches
request nonce = treasury nonceAfter a payment the nonce rises by one, so the same request can never run twice. - Before the deadline
current slot < deadline slotAt the deadline slot itself the payment is already refused. - The reserve stays
balance − amount ≥ rent for 128 bytesOtherwise the whole transaction is undone and nothing moves.
Example (same numbers as Try it)
- You create the treasury.
0.01 + 0.00130048 + 0.000005 = 0.01130548 SOLVEYDUCT fee, the reserve that stays in the treasury, and the network fee. - You deposit 1.5 SOL.Spendable: 1.5 SOL. The 0.00130048 SOL reserve is on top and never spendable.
- You prepare 0.4 SOL to a designer, deadline 250 slots, second owner B, and sign.1 of 2 signatures. Nothing moves.
- B signs the same transaction and it is sent.
network fee = 2 signatures × 5,000 lamports = 0.00001 SOLThe designer gets 0.4 SOL; spendable falls to 1.1 SOL; the nonce goes from 0 to 1.
Run the same steps in the Try it tab to see these numbers, and try sending with one signature or after the deadline.
Costs
- VEYDUCT fee to create a treasuryPaid once by owner one, in the same transaction, to VEYDUCT’s fee wallet. Shown in the review.
- 0.01 SOL
- Treasury rent reserve128 bytes at mainnet rent of 5,080 lamports per byte plus 128 bytes per account. It stays in the treasury.
- 0.00130048 SOL
- Network fee to create or depositOne signature.
- 0.000005 SOL
- Network fee for a paymentTwo owner signatures; owner one pays it.
- 0.00001 SOL
- Percentage feesDeposits and payments carry no VEYDUCT fee, and the program takes no cut.
- None
The program has no close instruction, so the Solana keeps an account alive only while it holds a minimum balance for its size (rent). For the 128-byte treasury that is 0.00130048 SOL, and no payment can touch it. is never refunded; it is what keeps the treasury account alive.
Deadlines and timing
- Deadline: 1 to 10,000 slots. Solana makes a Solana’s clock tick. A slot passes about every 0.4 seconds (about 9,000 an hour). Deadlines on chain are slot numbers, not minutes. about every 0.4 seconds, so 10,000 slots is roughly an hour. Slots are not exact minutes.
- Blockhash: about 150 blocks. Both signatures go on one transaction with one recent A fingerprint of a recent block that every Solana transaction carries. The network accepts it for about 150 blocks (roughly a minute); after that the transaction can no longer land., which Solana accepts for roughly a minute. If it expires, both owners sign a fresh request.
- No proposals, queue or time lock. This is same-transaction co-signing: when two owners sign, it pays at once. For holder-approved payments with a waiting period, use Treasury voting.
Edge cases and what can go wrong
Expired request
After the deadline slot, or once the blockhash expires, the request can never land. Prepare a new one; both owners sign again.
Two requests at once
Both carry the same nonce, so only the first to land pays. The other fails as a replay and moves nothing.
Amount above the balance
The program refuses anything that would dip into the rent reserve; the whole transaction is undone.
The wrong second owner
The request names its two signers. A different owner’s signature does not match it; prepare a new request naming them.
A lost owner key
The other two owners can still pay. If two keys are lost, the SOL is stuck for good: no one can recover it.
Unclear send result
The page saves the signature before sending and blocks a new transaction until you check it. It never retries by itself.
FAQ
Can one owner move the SOL alone?
No. Every payment needs two different owners’ signatures on the same transaction. There is no single-owner withdrawal.#
Can we change an owner later?
No. The three owners are fixed when the treasury is created. To change them, create a new treasury and pay the SOL into it with two signatures.#
How does the second owner sign?
Owner one exports a cosign file (public JSON with the transaction and signature). The second owner pastes it under “Cosign a request”, checks it against the live treasury and adds their signature.#
Why did our request expire?
Either the deadline slot passed or the blockhash did (about a minute). Sign promptly, and prepare a fresh request if it lapses.#
Can the treasury hold tokens?
No. This program moves SOL only.#
Can VEYDUCT touch the treasury?
No. VEYDUCT is not an owner and the program has no admin. The one VEYDUCT fee is the 0.01 SOL paid when the treasury is created.#
Can the program be changed after launch?
The release only switches the treasury on for a program with no upgrade authority (nobody can change its code), and the page checks the exact program bytes before every wallet action.#
Is the practice run real?
No. It runs on this page with a practice wallet and two simulated co-signers; nothing is signed or sent. It follows the program’s rules (fixed owners, nonce, deadline, reserve) and uses the same VEYDUCT fee, so its numbers match a real treasury.#
Tested in this release
Test results are published with each release
Every release build runs the treasury program’s exact pinned bytes and this page’s own code in an isolated Solana runtime (LiteSVM), through the site’s mainnet RPC allow-list and treasury relay. This copy of the site has no build results attached; Release status lists the latest release.
- Create a treasury with the exact 0.01 SOL VEYDUCT fee, deposit, then pay out with every pair of owners and exact balances.
- One owner alone, the third owner on someone else’s request, an outsider, too large an amount, an expired deadline and a replayed request are all refused.
- The 128-byte rent reserve always stays behind; a payment can never drain it.