diff --git a/src/agent/index.ts b/src/agent/index.ts index c3e7ac5..f11177f 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -54,6 +54,7 @@ import { deposit_to_multisig } from "../tools/squads_multisig/deposit_to_multisi 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"; +import { execute_transaction } from "../tools/squads_multisig/execute_proposal"; /** * Main class for interacting with Solana blockchain @@ -395,4 +396,10 @@ export class SolanaAgentKit { ): Promise { return approve_proposal(this, transactionIndex); } + + async executeMultisigTransaction( + transactionIndex?: number | bigint, + ): Promise { + return execute_transaction(this, transactionIndex); + } } diff --git a/src/tools/squads_multisig/execute_proposal.ts b/src/tools/squads_multisig/execute_proposal.ts new file mode 100644 index 0000000..60c21f4 --- /dev/null +++ b/src/tools/squads_multisig/execute_proposal.ts @@ -0,0 +1,49 @@ +import { SolanaAgentKit } from "../../index"; +import * as multisig from "@sqds/multisig"; +const { Multisig } = multisig.accounts; + +/** + * Executes a transaction on the Solana blockchain using the provided agent. + * + * @param {SolanaAgentKit} agent - The Solana agent kit instance containing the wallet and connection. + * @param {number | bigint} [transactionIndex] - Optional transaction index to execute. If not provided, the current transaction index from the multisig account will be used. + * @returns {Promise} - A promise that resolves to the transaction signature string. + * @throws {Error} - Throws an error if the transaction execution fails. + */ +export async function execute_transaction( + 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 multisigTx = await multisig.transactions.vaultTransactionExecute({ + connection: agent.connection, + blockhash: (await agent.connection.getLatestBlockhash()).blockhash, + feePayer: agent.wallet.publicKey, + multisigPda, + 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}`); + } +}