CONFIDENTIAL & PROPRIETARY © 2026 Inkwell Finance, Inc. All Rights Reserved. This document is for informational purposes only and does not constitute legal, tax, or investment advice, nor an offer to sell or a solicitation to buy any security or other financial instrument. Any examples, structures, or flows described here are design intent only and may change.The program checks exactly one thing about the admin:
invoke_signed from a PDA
satisfies that. So does a plain keypair or an MPC key.
The authority instruction set
Twelve instructions are authority-only. They are the only ones a multisig ever has to approve:update_policy, set_operator, propose_authority, accept_authority
(signed by the new authority), add_employee, update_salary,
approve_bonus, set_employee_active, open_pay_run, close_pay_run,
approve_treasury_withdrawal, and retarget_withdrawal (treasury
withdrawals).
They share five properties, and each property exists because some
multisig needs it:
Why no fresh signer and no Encrypt CPI
Every ciphertext the program creates is a fresh account that must sign its own creation, and every Encrypt CPI charges its fee to the payer’s Encrypt deposit. A multisig vault cannot supply either cleanly. So the work is split:- The multisig approves policy. It passes handles, wallets, periods, budgets and caps. No ciphertext is created and Encrypt is never called.
- Cranks and employees do the Encrypt work.
sync_treasury,init_employee_ledger,prepare_pay_runand the withdrawal steps create ciphertexts from fresh keypairs.process_paymentandprocess_bonusrun the pay graph. Whoever submits the instruction pays the Encrypt fee from their own deposit. Crank steps are permissionless (payments can be restricted to a designated operator) and bounded by the policy the multisig approved: run budget, per-payment cap, optional operator.
CreateInput, before the proposal exists. The proposal only references
them.
grant_view is not in the authority set. It creates a ciphertext (the
viewer’s copy), so it needs a fresh keypair and an Encrypt CPI. The
authority is permitted to call it, but it does not share the properties
above.Squads v4
- Program
SQDS4ep65T869zMMBKyuUq6aD6EgTu8psMjkvj52pCf, the same on mainnet and devnet. The vault PDA is["multisig", multisig, "vault", index]. - Create the company with
authorityset to the vault PDA. Fund it by sending the payroll mint from the vault to the company’s vault token account, in the same proposal asopen_pay_runif you like. - Tested against the mainnet binary. The integration test loads the
Squads v4 program dumped from mainnet. A 2-of-2 multisig proposes,
approves and executes one vault transaction containing
update_policy + add_employee + open_pay_run, with the vault as authority and rent payer. Permissionless cranks then pay the employee. The test also checks that a lone member signing directly is rejected. - SDK:
SquadsV4AuthorityprovidesproposeIxs→approveIx→executeIx. See SDK quickstart.
Altitude
Altitude is Squads’ business-account product. Its treasury is a Squads-controlled smart account, and its vault address is theauthority.
- If the account is on Squads v4, use
SquadsV4Authorityunchanged. - Unverified: some newer Squads accounts live on the Smart Account
program (
SMRTzfY6DfH5ik3TKiyLFfXexV8uSG3d2UksSCYdunG). The payroll program is unaffected, but proposals must be built with that program’s SDK. Check the owner program of the Altitude account on-chain before wiring it up.
Clearsig
Clearsig is its own multisig program (devnet53aZBmukjX5sYxbrYVRDd2DWzsRWVmvVFPY6PcyomR5v, pre-alpha). Signers approve
a human-readable message that the program renders from an intent
template and re-verifies. It then executes the templated instructions with
its vault PDA (["vault", wallet]) signing. Third-party programs integrate
by registering custom intents (JSON) on the wallet.
The SDK’s clearsigIntents() generates 12 templates, one per authority
instruction. For example:
address parameters. The payroll program re-derives and checks them, so a
wrong address fails.
Clearsig’s own notes on Encrypt pre-alpha testing say its frontend calls
Encrypt createInput, so HR-side salary encryption fits its UX.
SPL Governance / Realms
The native treasury PDA["native-treasury", governance] signs via
invoke_signed in execute_transaction, so it works as authority. Use
serializeInstructions() from the SDK to paste the authority instructions
into Realms as custom instructions.
Fireblocks / MPC custody
MPC custody produces an ordinary Ed25519 signature, so it works directly asauthority or as a Squads member.
Rotating the authority
Moving a company between multisigs (for example Squads to Clearsig) takes two steps:- From the current multisig:
propose_authority(new_authority). - From the new multisig:
accept_authority, signed by the new authority.
seed_authority, so every existing record, vault
and employee address stays valid. The rotation test runs a full pay and
withdraw cycle after the rotation to prove vault payouts still sign.