SplitPact user guide
Step-by-step walkthrough for using the dashboard at https://splitpact.com.
If a term below is unfamiliar ("node", "edge", "condition"), open CONCEPTS.md first — this guide assumes you know the basic vocabulary.
1. Sign in
You need a Solana wallet on devnet (Phantom, Solflare,
Backpack — any wallet that supports Sign-In-With-Solana). Devnet SOL
is free from solana airdrop 1 or https://faucet.solana.com.
Hit splitpact.com, click any of the "Launch App" or "Create Pact" buttons. The wallet modal opens automatically — pick your wallet, approve the connection, then approve a signMessage request. That second approval doesn't spend gas; it just proves you control the wallet. The page itself stays visible behind the modal the whole time.
After sign-in you're dropped back wherever you were going (create page, dashboard, etc).
2. Pick the flow
Click New pact or Create Pact → you land on /create with two
options.
| You want to… | Pick |
|---|---|
| Automate how money moves inside your own business (payroll, dev fund, treasury top-ups) | Automate your own cash flow → business flow |
| Split a revenue stream between multiple people who need to agree (co-founders, royalty holders, grantees) | Split income between partners → partnership flow |
You can always start over and pick the other one — nothing is committed until you Finalize on-chain.
3a. Partnership flow (templates)
At /create/partnership you see four cards. Each maps to a template
builder in @splitpact/partnership-sdk:
- Share the income (Revenue Split) — flat N-way split. Every incoming payment goes out immediately, split by fixed percentages.
- Unlock by goal (Milestone Agreement) — each partner starts earning only after the pact's cumulative inflow passes a threshold you set for them.
- Pay over time (Vesting Agreement) — one beneficiary, active between two dates, with an optional total cap.
- Author + distributor (Royalty with Cap) — two parties. Primary earns up to a maximum; once hit, 100% goes to secondary.
Pick one and:
- Fill the form. Add wallets, set percentages or amounts. The right panel shows a read-only preview of the graph that will be created. Percentages have to add up to 100% for most templates — the submit button won't light up until they do.
- Publish Preview. Creates the proposal at
awaiting_signatures, navigates you to/proposal/<id>. - Share the URL with every partner wallet listed on the pact.
- Partners review and sign on the preview page. Each hits
Approve → their wallet fires a
signMessage→ the signature lands in the DB. The hash of the canonical payload is part of the signed message, so editing any field invalidates existing signatures. - Finalize. Once every partner has signed the pact is
ready. The creator clicks Finalize → their wallet signs a real Solana transaction → theFlowPactPDA is created on devnet. After this the pact is immutable.
3b. Business flow (DAG editor)
At /create/business you get the full canvas editor.
Navigation:
- Left panel — palette. Drag nodes and condition pills from here onto the canvas. Externals (recipient wallets) are added via the "+ External" button which prompts for a pubkey.
- Middle — canvas. Pan / zoom with mouse. Undo / redo via Ctrl+Z / Ctrl+Shift+Z (snapshots capped at 50, evicted after 10 min idle).
- Right panel — inspector. Click any node / edge / pill to edit its fields (label, share percentage, condition params).
- Bottom — simulator. Pick a test amount; it shows who gets what if you dropped that much into the pact right now.
Drawing a connection
- Click a source node to select it (outlined in blue).
- Hover near one of its edges. A small ghost arrow shows up, snapped to the nearest connection slot.
- Click-drag from the ghost to the target node / pill. Release over the target. A line is created.
- If you drop on empty canvas, you get a dialog asking for an external wallet — so pulling an edge "into space" is the fast way to add a new recipient.
Adding a condition
- Drag a pill (AfterInflow / InflowRange / CapOutflow / TimeGate / WhenHoldingAtLeast) from the palette. It starts disconnected.
- Wire the source node into the pill's left side, and the pill's right side into the target node / wallet. The pill sits on the edge.
- Click the pill and fill in its numeric parameters in the
inspector. Conditions with zero-or-invalid params (
min ≥ max,cap = 0) are surfaced as warnings and dropped from the canonical graph until you fix them — you won't accidentally save an invalid condition to the server.
Sharing the draft
Click Share to add collaborators. Viewers can open the proposal read-only; editors can save changes. Both need to be signed in with their own wallet. Useful if you want your accountant or ops teammate to refine the flow before you deploy.
Autosave
Edits save automatically:
- Structural (adding / removing a node, edge, or pill) flushes after ~2.5 seconds.
- Non-structural (moving a node, editing a label, typing in a param) flushes after ~8 seconds of idle.
- Hard cap: no edit stays unsent longer than 30 seconds of continuous activity.
Closing the tab flushes whatever's pending. Offline edits stay in localStorage; they sync when you come back online.
Preview + finalize
Hit Preview in the toolbar → navigates to /proposal/<id>. Same
page as the partnership flow, minus the signature collection (business
proposals are single-signer).
- Finalize → your wallet signs a Solana transaction → on-chain
FlowPactaccount is created. The draft becomes read-only; all further activity happens against the PDA.
4. After finalize
Once on-chain:
- Deposit: anyone can send the pact's
tokenMint(USDC devnet by default) into the pact's vault ATA. No signature needed beyond the depositor's own SPL transfer. - Flush: anyone can call
flushNodeon any internal node. The program computes outgoing transfers per the rules (see CONCEPTS.md for the algorithm) and CPIs SPL transfers. Again, permissionless — there's no keeper key. - Emergency flush: only the controller wallet can call this. It
drains a node's full holding to a pre-declared
emergency_targetwallet. Partnership pacts havecontroller = nulland so no emergency flush.
Troubleshooting
- "save failed: 400" while editing a business pact → usually a pill with zero params. The dashboard used to compile those into invalid canonical edges and the server rejected them. Latest build drops invalid pills from canonical until you fill them in.
- Drag from a node doesn't start a connection → make sure the node is selected first; the ghost arrow only appears on the selected node's border.
- Line doesn't reach the node's dot exactly → small cosmetic gap, not a bug. The connection is valid.
- Partner says they can't sign → make sure they're opening the
/proposal/<id>URL while signed in with the EXACT wallet listed as a partner. Different wallet = 403 on the sign endpoint.