import { PublicKey, Transaction, TransactionMessage } from "@solana/web3.js";
import { GlamClient, getProgramAndBitflagByProtocolName } from "@glamsystems/glam-sdk";
import * as multisig from "@sqds/multisig";
// Initialize clients
const glamClient = new GlamClient({
statePda: new PublicKey("GlamState111111111111111111111111111111111"),
});
const multisigPda = new PublicKey("SquadsMultisig111111111111111111111111111");
// Derive the Squads vault PDA (index 0 is the default vault)
const [squadsVaultPda] = multisig.getVaultPda({
multisigPda,
index: 0,
});
// 1. Build the GLAM instruction
const permissionsMap = getProgramAndBitflagByProtocolName();
const [integrationProgram, protocolBitflag] = permissionsMap["JupiterSwap"];
const ix = await glamClient.access.txBuilder.enableDisableProtocolsIx(
new PublicKey(integrationProgram),
parseInt(protocolBitflag, 2),
true, // enable
squadsVaultPda // signer is the Squads vault
);
// 2. Wrap into a transaction message
const blockhash = (await glamClient.blockhashWithCache.get()).blockhash;
const txMessage = new TransactionMessage({
payerKey: squadsVaultPda,
recentBlockhash: blockhash,
instructions: [ix],
});
// 3. Get the next transaction index
const multisigInfo = await multisig.accounts.Multisig.fromAccountAddress(
glamClient.connection,
multisigPda
);
const newTransactionIndex = BigInt(Number(multisigInfo.transactionIndex) + 1);
// 4. Create Squads vault transaction instruction
const ixCreateSquadsTx = multisig.instructions.vaultTransactionCreate({
multisigPda,
transactionIndex: newTransactionIndex,
creator: glamClient.signer,
vaultIndex: 0,
ephemeralSigners: 0,
transactionMessage: txMessage,
});
// 5. Create Squads proposal instruction
const ixCreateSquadsProposal = multisig.instructions.proposalCreate({
multisigPda,
creator: glamClient.signer,
transactionIndex: newTransactionIndex,
});
// 6. Send the transaction
const tx = new Transaction().add(ixCreateSquadsTx, ixCreateSquadsProposal);
const vTx = await glamClient.intoVersionedTransaction(tx);
const txSig = await glamClient.sendAndConfirm(vTx);
// 7. Get the proposal URL
const [transactionPda] = multisig.getTransactionPda({
multisigPda,
index: newTransactionIndex,
});
console.log(
"View proposal:",
`https://app.squads.so/squads/${squadsVaultPda}/transactions/${transactionPda}`
);