Skip to main content
A ParticipantSet lets several independent members authorize one Swig role with an M-of-N threshold. The set belongs to one Swig config, and the role controls what the set may do through the same typed actions used by any other role. Members can use Ed25519, secp256k1, or secp256r1/passkeys. Each member signs a challenge bound to the prepared operation, while every challenge in the plan commits to the same shared ParticipantSet nonce.
This interface is available on the Developer SDK main branch and will ship in the next package release. The currently published TypeScript 0.9.0 and Python 0.8.0 packages predate ParticipantSet support.

Create the set and add its role

First prepare the ParticipantSet creation transaction. After that transaction lands, use the general role endpoint to attach the set to a role and choose its permissions.
TypeScript
Both calls return prepared transactions. Sign and submit createdSet.transaction / created_set.transaction first, then sign and submit addRole / add_role through your normal transaction flow. Creating the set does not add a Swig role automatically. The add-role requester must currently be an Ed25519 or secp256r1 authority. A ParticipantSet can be the new role authority, but cannot request the add-role operation itself.

Prepare an operation

After both setup transactions land, select the ParticipantSet as the requester. Supported preparation routes return a normal prepared transaction with a participantSetApprovalPlan / participant_set_approval_plan.
TypeScript
ParticipantSet preparation currently supports SOL transfers, token transfers, transfer batches, and custom instructions without address lookup tables. Swaps, recovery operations, and custom transactions with address lookup tables require a direct non-ParticipantSet requester. Serialize ParticipantSet operations per set. Concurrent plans use the same next nonce; after one transaction lands, prepare and approve the others again.

Collect member approvals

Send each selected member only its own approval request. The detached signer helpers verify that the signer type and public key match that request before asking the application-owned signer to approve it.
TypeScript
Your application remains responsible for passkey credential selection and its RP ID/origin policy. Do not ask a member to sign the raw serialized transaction or another member’s challenge.

Compile and submit

Return the detached approvals with the original prepared transaction. The API validates the plan and simulates the final transaction before returning it.
TypeScript
Compilation does not sponsor, broadcast, or confirm the transaction. Add every remaining Solana transaction signature, then submit directly or use Sponsor & Submit before the authorization expiration slot. If the slot has passed, prepare a fresh operation and collect fresh approvals.

Approval and submission boundaries

  • Prepare a fresh plan and collect fresh approvals for each distinct transaction.
  • Keep every approval with its original plan and shared nonce.
  • Keep the Swig API key in the server client; detached signer helpers accept no API key and make no hosted API calls.
  • Add transaction-level signatures such as the fee payer or another required Ed25519 signer after compilation.