diff --git a/src/tools/squads_multisig/create_proposal.ts b/src/tools/squads_multisig/create_proposal.ts new file mode 100644 index 0000000..73d31ea --- /dev/null +++ b/src/tools/squads_multisig/create_proposal.ts @@ -0,0 +1,62 @@ +import { SolanaAgentKit } from "../../index"; +import { + PublicKey, + SystemProgram, + TransactionInstruction, + TransactionMessage, +} from "@solana/web3.js"; +import { LAMPORTS_PER_SOL } from "@solana/web3.js"; +import { + getAssociatedTokenAddress, + createTransferInstruction, + getMint, +} from "@solana/spl-token"; +import * as multisig from "@sqds/multisig"; +const { Multisig } = multisig.accounts; + +/** + * Transfer SOL or SPL tokens to a recipient from a multisig vault. + * @param agent - SolanaAgentKit instance. + * @param amount - Amount to transfer. + * @param to - Recipient's public key. + * @param vaultIndex - Optional vault index, default is 0. + * @param mint - Optional mint address for SPL tokens. + * @returns Transaction signature. + */ +export async function create_proposal( + agent: SolanaAgentKit, + transactionIndex?: number | bigint, +): Promise { + try { + const createKey = agent.wallet; + const [multisigPda] = multisig.getMultisigPda({ + createKey: createKey.publicKey, + }); + const multisigInfo = await Multisig.fromAccountAddress( + agent.connection, + multisigPda, + ); + const currentTransactionIndex = Number(multisigInfo.transactionIndex); + if (!transactionIndex) { + transactionIndex = BigInt(currentTransactionIndex - 1); + } else if (typeof transactionIndex !== "bigint") { + transactionIndex = BigInt(transactionIndex); + } + + const multisigTx = multisig.transactions.proposalCreate({ + blockhash: (await agent.connection.getLatestBlockhash()).blockhash, + feePayer: agent.wallet_address, + multisigPda, + transactionIndex, + creator: agent.wallet_address, + }); + + multisigTx.sign([agent.wallet]); + const tx = await agent.connection.sendRawTransaction( + multisigTx.serialize(), + ); + return tx; + } catch (error: any) { + throw new Error(`Transfer failed: ${error}`); + } +}