diff --git a/src/agent/index.ts b/src/agent/index.ts index f8054cf..96b693b 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -53,6 +53,7 @@ import { create_squads_multisig } from "../tools/squads_multisig/create_multisig import { deposit_to_multisig } from "../tools/squads_multisig/deposit_to_multisig"; import { transfer_from_multisig } from "../tools/squads_multisig/transfer_from_multisig"; import { create_proposal } from "../tools/squads_multisig/create_proposal"; +import { approve_proposal } from "../tools/squads_multisig/approve_proposal"; /** * Main class for interacting with Solana blockchain @@ -388,4 +389,11 @@ export class SolanaAgentKit { ): Promise { return create_proposal(this, transactionIndex); } + + async approveMultisigProposal( + proposalId: PublicKey, + transactionIndex?: number | bigint, + ): Promise { + return approve_proposal(this, transactionIndex); + } } diff --git a/src/tools/squads_multisig/approve_proposal.ts b/src/tools/squads_multisig/approve_proposal.ts new file mode 100644 index 0000000..178f4d5 --- /dev/null +++ b/src/tools/squads_multisig/approve_proposal.ts @@ -0,0 +1,52 @@ +import { SolanaAgentKit } from "../../index"; +import * as multisig from "@sqds/multisig"; +const { Multisig } = multisig.accounts; + +/** + * Approves a proposal in a Solana multisig wallet. + * + * @param {SolanaAgentKit} agent - The Solana agent kit instance. + * @param {number | bigint} [transactionIndex] - The index of the transaction to approve. If not provided, the current transaction index will be used. + * @returns {Promise} - A promise that resolves to the transaction ID of the approved proposal. + * @throws {Error} - Throws an error if the approval process fails. + */ +export async function approve_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); + } else if (typeof transactionIndex !== "bigint") { + transactionIndex = BigInt(transactionIndex); + } + // const [proposalPda, proposalBump] = multisig.getProposalPda({ + // multisigPda, + // transactionIndex, + // }); + const multisigTx = multisig.transactions.proposalApprove({ + blockhash: (await agent.connection.getLatestBlockhash()).blockhash, + feePayer: agent.wallet.publicKey, + multisigPda, + transactionIndex: transactionIndex, + member: agent.wallet.publicKey, + }); + + multisigTx.sign([agent.wallet]); + const tx = await agent.connection.sendRawTransaction( + multisigTx.serialize(), + ); + return tx; + } catch (error: any) { + throw new Error(`Transfer failed: ${error}`); + } +}