Launch a vault

01Overview

Vouch is a payment layer between on-chain communities and fundraisers that do not accept crypto. A community points a token’s creator fees at an Impact Vault. The vault sweeps those fees to USDC, delivers them to the fundraiser through a rail the fundraiser already accepts, and publishes a receipt for every delivery. The receipt is hashed and the hash is anchored on Solana so it can be verified by anyone, forever, without trusting Vouch.

Nothing about this requires the fundraiser to know what a token is. The organizer sees a donation on their page, the same as any other. The community sees a public ledger of where every dollar went.

ObjectWhat it is
CauseA fundraiser: its platform, URL, beneficiary, and verification status.
VaultA USDC treasury tied to exactly one cause. Owns one or more tokens' fee routes.
TokenA launched token whose creator fees are routed, in whole or in part, to a vault.
Fee eventOne creator-fee payment observed on-chain, attributed to a token by its route address.
SweepA swap of accumulated fee assets (SOL, the token) into USDC in the vault treasury.
DeliveryOne payment from the vault to the cause over a rail, with the receipt that proves it.
ReceiptCanonical JSON for a delivery, its SHA-256, and the Solana memo transaction anchoring that hash.

02Fee routing

Attribution is done at the address level. Every token connected to a vault gets its own route address: a fresh keypair whose secret is held by Vouch and whose public key is the only place the token’s creator fees should land. Because the route address is unique per token, any SOL arriving there is that token’s revenue with no further inference.

pump.fun

pump.fun creator fees pay to a single creator wallet, and the creator can redirect them exactly once. Connecting a pump.fun token means submitting that one-time redirect to the token’s route address. The redirect transaction is recorded as the route proof and the route is marked locked. Because it cannot be changed again, a locked pump.fun route is the strongest form of commitment Vouch supports: 100% of creator fees, permanently.

Bags

Bags supports fee-share configurations with up to 100 claimers, each assigned a share in basis points. Connecting a Bags token means adding the route address as a claimer with a stated share. Vouch records the share as the token’s route bps and only counts fees actually received at the route address, so a 5,000 bps share claims exactly half of what the token earns.

Meteora and manual routes

Tokens on other launchpads can be connected by pointing their fee destination at a route address by whatever mechanism the launchpad offers. Where the mechanism is not on-chain-immutable, the route is shown as unlocked. Unlocked routes are eligible for delivery but not for the $VOUCH fee match.

Vouch never takes custody of a token’s supply or the creator’s wallet. The only thing it holds is the route address the fees are sent to.

03Vault & sweep

A vault is a custodial USDC treasury on Solana with one cause attached. Its keypair is generated at creation and stored encrypted under a KMS key; the secret is never returned by any query or API. A vault has two policy numbers set by its owner: the donate share in basis points (how much of swept USDC must be delivered, with the remainder kept for gas and operations) and the delivery threshold in USD (deliveries queue automatically once treasury USDC crosses it).

Sweep

A worker watches every route address. When fees accumulate above a small dust threshold, they are swapped to USDC through Jupiter and sent to the vault treasury. Each sweep records the input asset and amount, the USDC received, the swap signature, and which fee events it consumed. Fee events are priced in USD at block time so the ledger totals do not move with the market afterwards.

  • A fee event belongs to exactly one sweep once swept, and to exactly one token always.
  • Sweep slippage is real and shown: the USDC received is what gets delivered, not the USD value at fee time.
  • Treasury balance is read from chain; the ledger is a record, not a source of funds.

04Delivery rails

A rail is how USDC becomes a payment the fundraiser can receive. The honest version of the situation is this: consumer fundraising platforms such as GoFundMe, LaunchGood, and JustGiving do not have a donation API. Automating their checkout with a script or browser bot violates their terms of service and puts the campaign at risk of being frozen. Vouch does not do that.

Operator card (live)

Vault USDC funds a top-up to a Zentro card. A named operator with the operator role makes the donation on the fundraiser’s own page with that card, then attaches the confirmation (email, page screenshot, card statement line) as artifacts. The operator signs off in the operator desk; the delivery is finalized with the card reference, fiat amount, FX rate, and any platform fee. The operator’s user id is part of the receipt.

This is a human step by design. It is auditable rather than automatic. Each artifact is stored by hash, so evidence cannot be substituted after the receipt is anchored.

On-chain USDC (live)

When a cause holds a Solana address, delivery is one USDC transfer from the vault treasury to that address. The transfer signature is the rail reference. No FX, no platform fee, no operator in the loop beyond finalizing the receipt.

Issuing card (in integration)

For platforms whose terms permit programmatic card donations, a virtual card can be issued per vault through Rain or Bridge and funded directly from USDC. This removes the operator from execution. It has not been used for any delivery yet and is shown as in integration until it has.

GoFundMe Pro (nonprofits only)

Registered nonprofits on GoFundMe Pro can authorize Vouch via OAuth, after which donations are posted through the official API with the receipt id in the donation memo. Personal campaigns cannot use this rail.

RailExecuted byRail referenceStatus
operator_cardOperatorCard last 4 + authorization codelive
onchainWorkerUSDC transfer signaturelive
issuing_cardWorkerCard authorization idin integration
gofundme_proWorkerDonation idnonprofits
stripe_linkWorkerStripe payment idwhen a cause provides one

05Receipt spec

A receipt is the canonical JSON for a delivery. It is built once at finalize time, hashed with SHA-256, and the hash is written into a Solana memo. The canonical form is deterministic: keys sorted at every level, no whitespace, nulls preserved, timestamps as ISO 8601 strings in UTC. Delivery status is deliberately excluded so the bytes never change once the delivery is delivered.

canonical receipt, shown with whitespace for reading
{
  "v": 1,
  "id": "dlv_basmalah_4",
  "ordinal": 4,
  "vault": { "id": "vlt_basmalah", "slug": "basmalah", "name": "Basmalah Vault", "treasuryAddress": "<base58>" },
  "cause": { "id": "cau_basmalah", "slug": "basmalah-sma", "title": "Basmalah's fight against SMA Type 1", "platform": "gofundme", "url": "https://www.gofundme.com/f/help-basmalah-fight-sma" },
  "amountUsdc": 14638.02,
  "amountFiat": 14638.02,
  "fiatCurrency": "USD",
  "fxRate": 1,
  "platformFeeFiat": 424.8,
  "rail": "operator_card",
  "railRef": "Visa •••• 4821 · auth 512930",
  "fundingTxSig": "<solana signature>",
  "allocations": [
    { "tokenId": "tok_basma", "symbol": "BASMA", "amountUsdc": 7088.29 },
    { "tokenId": "tok_dose",  "symbol": "DOSE",  "amountUsdc": 5224.95 },
    { "tokenId": "tok_hope",  "symbol": "HOPE",  "amountUsdc": 2324.78 }
  ],
  "artifacts": [
    { "kind": "confirmation", "label": "GoFundMe confirmation email", "sha256": "<hex>", "bytes": 48213 },
    { "kind": "statement",    "label": "Card statement line",         "sha256": "<hex>", "bytes": 1024 }
  ],
  "period": { "label": "Week 4", "startsAt": "2026-09-12T00:00:00.000Z", "endsAt": "2026-09-19T00:00:00.000Z" },
  "deliveredAt": "2026-09-19T14:09:52.484Z"
}
FieldMeaning
vReceipt format version. Always 1 today.
id · ordinalDelivery id, and the per-vault sequential number printed as VCH-0004.
vault · causeIdentity of the vault and cause at finalize time, including the cause URL.
amountUsdcUSDC leaving the treasury for this delivery.
amountFiat · fiatCurrency · fxRateWhat the fundraiser received in its currency, and the rate applied. Null on on-chain deliveries.
platformFeeFiatFee taken by the fundraising platform or card network, if any.
rail · railRef · fundingTxSigWhich rail, its reference, and the USDC transfer that funded it.
allocationsHow much of the delivery each token funded, pro-rata by undelivered fees. Sorted by tokenId. Sums to amountUsdc.
artifactsEvidence files by kind, label, SHA-256, and size. Sorted by sha256. Files live in object storage; only the hashes are canonical.
periodReporting window the delivery closes, if any.
deliveredAtWhen the rail confirmed the payment.

Hash and memo

hash = sha256(canonical), hex encoded. The memo transaction carries vouch:v1:<deliveryId>:<hash> through the Solana Memo program and is signed by the vault treasury key, so the anchor is attributable to the vault that made the delivery.

06Verification

Every receipt page shows the canonical string, the stored hash, and the anchor signature, and recomputes the hash in front of you. You do not have to trust that page. Recompute it yourself from the public export:

shell
# 1. fetch the public receipt export for the vault
curl -s https://vouch.fund/api/vaults/basmalah/receipts.json > receipts.json

# 2. take one receipt's canonical string and hash it
jq -r '.[] | select(.id=="dlv_basmalah_4") | .canonical' receipts.json \
  | tr -d '\n' | sha256sum

# 3. compare with the stored hash and the on-chain memo
jq -r '.[] | select(.id=="dlv_basmalah_4") | .hash, .anchorTxSig' receipts.json
# memo in that transaction must read:
#   vouch:v1:dlv_basmalah_4:<hash>
  • If the recomputed hash matches the stored hash, the receipt content has not changed since finalize.
  • If the on-chain memo carries the same hash, the receipt existed at that block time and was signed by the vault treasury.
  • If an artifact's hash matches the file you were shown, that file is the evidence the operator attached.
  • The verify endpoint GET /api/receipts/<id>/verify does the same three checks and returns them as JSON.
A receipt proves that a specific payment was recorded, hashed, and anchored. It does not prove the fundraiser spent the money well. Verification of the cause itself is a human process and is stated as such on every cause page.

07Periods

Vaults report in weekly periods. A period records fees in and USDC delivered out for its window. Deliveries reference the period they close, so a vault page can show, for any week, what came in, what went out, and the receipts behind it. Periods do not change accounting; they are the reading frame.

08Roles

RoleCanCannot
OwnerCreate a vault, connect tokens, set the donate share and delivery threshold, pause the vault.Move treasury USDC anywhere except to the cause through a rail. Edit or delete receipts.
OperatorExecute operator-card deliveries, attach artifacts, finalize receipts, verify causes.Change vault policy. Finalize a delivery without a rail reference and at least one artifact.
AdminGrant the operator role, rotate the KMS key, retire rails.Alter a finalized receipt. The hash is on-chain; an edit is visible.

Sign-in is Google, directly. Each account gets a custodial Solana wallet whose key is held encrypted by Vouch. The operator role is granted by email allow-list and is shown on the operator’s public profile on every receipt they finalize.

09FAQ

Does the fundraiser need to do anything?+

No. The donation arrives on their page like any other. Organizers who want to can link their page to the vault so the receipt shows on both sides.

Why is a person making the card payment?+

Because the platforms these families use have no API and forbid automation. A named operator with hash-anchored evidence is the honest option. Where a platform permits programmatic donations, the issuing-card rail removes the operator.

Who pays the platform fee?+

The fundraising platform or card network takes its fee from the donation as it would for anyone. The receipt records it as platformFeeFiat so the net amount is explicit.

What happens to the part of fees that is not donated?+

The donate share is set per vault and shown on its page. The remainder stays in the treasury for swap and delivery gas. Nothing leaves a vault except through a rail to its cause.

Can a receipt be edited?+

No. Its hash is on-chain. A correction is a new delivery, or a reversal, with its own receipt that references the original.

Is $VOUCH required?+

No. Any token on a supported launchpad can route fees to a vault. $VOUCH funds the Commons vault, which matches fees for tokens launched under the three rules.