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
A payment request collecting two of three owner signaturesExample with the practice run’s numbers: a request to pay 0.4 SOL to a designer, deadline 250 slots. You sign, co-signer B signs, co-signer C is not needed. With 2 of 2 signatures the payment is sent: spendable falls from 1.5 to 1.1 SOL and the 0.00130048 SOL reserve stays. Payment request · example Sent 1 of 2 signed 0.4 SOL to the designer’s wallet You Co-signer B Cnot needed Signatures 1 of 22 of 2 Deadline250 slots ≈ 100 s Spendable 1.5 SOL1.1 SOL Reserve stays0.00130048 SOL
Example · same numbers as Try it

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.

Pre-launch

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

Needs 2 of 3 owners

The wallet that gets paid, for example your designer’s. Check the first and last four characters: a sent payment can’t be reversed.

Amount in SOL, like 0.4: at most what is spendable, because the rent reserve always stays. Deadline: 1 to 10,000 slots; 250 slots is about 100 seconds, time for the second owner to sign.

The owner who signs with you. Only that owner’s signature can complete this request. You pay the network fee. The deadline is a slot boundary (about 400 ms each), not a guaranteed number of minutes, and the second owner must sign within the deadline.

What happens next: the review fixes the recipient, amount and deadline. You add your signature, then export the cosign file for the second owner.

Cosign a request

For the second owner

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
Example

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:

  1. Two different owners signedsigner one ≠ signer two, both in the owner listThe page names the second owner when you prepare; only that owner’s signature completes the transaction.
  2. The nonce matchesrequest nonce = treasury nonceAfter a payment the nonce rises by one, so the same request can never run twice.
  3. Before the deadlinecurrent slot < deadline slotAt the deadline slot itself the payment is already refused.
  4. The reserve staysbalance − amount ≥ rent for 128 bytesOtherwise the whole transaction is undone and nothing moves.

Example (same numbers as Try it)

  1. 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.
  2. You deposit 1.5 SOL.Spendable: 1.5 SOL. The 0.00130048 SOL reserve is on top and never spendable.
  3. You prepare 0.4 SOL to a designer, deadline 250 slots, second owner B, and sign.1 of 2 signatures. Nothing moves.
  4. 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.