Overview
Add arbitrary transactions to execute through your multisig. Vault Transactions allow you to take actions from programs across Solana and execute them inside your multisig.Prerequisites
- Existing multisig
@sqds/multisigpackage installed- Member with Proposer permissions
Quick Example
import * as multisig from "@sqds/multisig";
import { PublicKey, Connection, SystemProgram, TransactionMessage } from "@solana/web3.js";
const connection = new Connection("<your rpc url>");
const [multisigPda] = multisig.getMultisigPda({
createKey: new PublicKey("<your createkey>"),
});
const [vaultPda] = multisig.getVaultPda({
multisigPda,
index: 0,
});
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
multisigPda | PublicKey | Yes | PDA of the multisig |
transactionIndex | bigint | Yes | Index for this transaction (current index + 1) |
creator | PublicKey | Yes | Member creating the transaction |
vaultIndex | number | Yes | Index of the vault to execute from |
ephemeralSigners | number | Yes | Number of ephemeral signers needed (use 0 if none) |
transactionMessage | TransactionMessage | Yes | Message containing instructions to execute |
memo | string | No | Optional memo for the transaction |
Full Example
import * as multisig from "@sqds/multisig";
import { PublicKey, Connection, LAMPORTS_PER_SOL, SystemProgram, TransactionMessage } from "@solana/web3.js";
async function main(member: PublicKey) {
// Cluster Connection
const connection = new Connection("<your rpc url>");
// If you've saved your createKey, you can define it as a static PublicKey
const createKey = new PublicKey("<your createkey>")
// Derive the multisig PDA
const [multisigPda] = multisig.getMultisigPda({
createKey,
});
// or
// const multisigPda = new PublicKey("<your multisig key>");
// Derive the PDA of the Squads Vault
const [vaultPda] = multisig.getVaultPda({
multisigPda,
index: 0,
});
// Get deserialized multisig account info
const multisigInfo = await multisig.accounts.Multisig.fromAccountAddress(
connection,
multisigPda
);
// Get the updated transaction index
const currentTransactionIndex = Number(multisigInfo.transactionIndex);
const newTransactionIndex = BigInt(currentTransactionIndex + 1);
const to = new PublicKey("<>");
const transferInstruction = SystemProgram.transfer({
// The transfer is being signed by the vault that's executing
fromPubkey: vaultPda,
toPubkey: to,
lamports: 1 * LAMPORTS_PER_SOL
});
// Build a message with instructions we want to execute
const testTransferMessage = new TransactionMessage({
payerKey: vaultPda,
recentBlockhash: (await connection.getLatestBlockhash()).blockhash,
instructions: [transferInstruction],
});
const ix = await multisig.instructions.vaultTransactionCreate({
multisigPda,
transactionIndex: newTransactionIndex,
creator: member,
vaultIndex: 0,
ephemeralSigners: 0,
transactionMessage: testTransferMessage,
memo: "Our first transfer!"
});
}
Error Handling
| Error | Cause | Solution |
|---|---|---|
| Invalid transaction index | Wrong index value | Fetch current index from multisig account |
| Insufficient permissions | Member lacks Proposer permission | Use a member with Proposer permissions |