From 4539baf06432663753d83ece1d465dd102ca935c Mon Sep 17 00:00:00 2001 From: Pileks Date: Mon, 30 Mar 2026 19:37:25 +0200 Subject: [PATCH 1/2] refactor(futarchy): replace vault transaction account with transaction_index arg in admin_approve_multisig_proposal --- .../admin_approve_multisig_proposal.rs | 26 ++++------ programs/futarchy/src/lib.rs | 5 +- sdk/src/v0.7/types/futarchy.ts | 48 +++++++++++++++---- .../unit/adminApproveMultisigProposal.test.ts | 12 ++--- .../unit/adminExecuteMultisigProposal.test.ts | 4 +- 5 files changed, 58 insertions(+), 37 deletions(-) diff --git a/programs/futarchy/src/instructions/admin_approve_multisig_proposal.rs b/programs/futarchy/src/instructions/admin_approve_multisig_proposal.rs index 4a89277c..5b52ca60 100644 --- a/programs/futarchy/src/instructions/admin_approve_multisig_proposal.rs +++ b/programs/futarchy/src/instructions/admin_approve_multisig_proposal.rs @@ -7,7 +7,13 @@ mod admin { declare_id!("CWGawadYU8CzRVBecnJymNw97H7E3ndDinV5sMzesgY2"); } +#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)] +pub struct AdminApproveMultisigProposalArgs { + pub transaction_index: u64, +} + #[derive(Accounts)] +#[instruction(args: AdminApproveMultisigProposalArgs)] pub struct AdminApproveMultisigProposal<'info> { #[account(mut, has_one = squads_multisig)] pub dao: Account<'info, Dao>, @@ -32,7 +38,7 @@ pub struct AdminApproveMultisigProposal<'info> { squads_multisig_program::SEED_PREFIX, squads_multisig.key().as_ref(), squads_multisig_program::SEED_TRANSACTION, - squads_multisig_vault_transaction.index.to_le_bytes().as_ref(), + args.transaction_index.to_le_bytes().as_ref(), squads_multisig_program::SEED_PROPOSAL, ], bump, @@ -40,25 +46,12 @@ pub struct AdminApproveMultisigProposal<'info> { )] pub squads_multisig_proposal: Account<'info, squads_multisig_program::Proposal>, - #[account( - seeds = [ - squads_multisig_program::SEED_PREFIX, - squads_multisig.key().as_ref(), - squads_multisig_program::SEED_TRANSACTION, - squads_multisig_vault_transaction.index.to_le_bytes().as_ref(), - ], - bump, - seeds::program = squads_multisig_program - )] - pub squads_multisig_vault_transaction: - Account<'info, squads_multisig_program::VaultTransaction>, - pub squads_multisig_program: Program<'info, squads_multisig_program::program::SquadsMultisigProgram>, } impl AdminApproveMultisigProposal<'_> { - pub fn validate(&self) -> Result<()> { + pub fn validate(&self, _args: &AdminApproveMultisigProposalArgs) -> Result<()> { #[cfg(feature = "production")] require_keys_eq!(self.admin.key(), admin::ID, FutarchyError::InvalidAdmin); @@ -69,13 +62,12 @@ impl AdminApproveMultisigProposal<'_> { Ok(()) } - pub fn handle(ctx: Context) -> Result<()> { + pub fn handle(ctx: Context, _args: AdminApproveMultisigProposalArgs) -> Result<()> { let Self { dao, admin: _, squads_multisig, squads_multisig_proposal, - squads_multisig_vault_transaction: _, squads_multisig_program, } = ctx.accounts; diff --git a/programs/futarchy/src/lib.rs b/programs/futarchy/src/lib.rs index d3ca8884..acdd8449 100644 --- a/programs/futarchy/src/lib.rs +++ b/programs/futarchy/src/lib.rs @@ -150,11 +150,12 @@ pub mod futarchy { CollectMeteoraDammFees::handle(ctx) } - #[access_control(ctx.accounts.validate())] + #[access_control(ctx.accounts.validate(&args))] pub fn admin_approve_multisig_proposal( ctx: Context, + args: AdminApproveMultisigProposalArgs, ) -> Result<()> { - AdminApproveMultisigProposal::handle(ctx) + AdminApproveMultisigProposal::handle(ctx, args) } #[access_control(ctx.accounts.validate())] diff --git a/sdk/src/v0.7/types/futarchy.ts b/sdk/src/v0.7/types/futarchy.ts index ea0ab7c8..07d3d285 100644 --- a/sdk/src/v0.7/types/futarchy.ts +++ b/sdk/src/v0.7/types/futarchy.ts @@ -1204,17 +1204,19 @@ export type Futarchy = { isSigner: false; }, { - name: "squadsMultisigVaultTransaction"; + name: "squadsMultisigProgram"; isMut: false; isSigner: false; }, + ]; + args: [ { - name: "squadsMultisigProgram"; - isMut: false; - isSigner: false; + name: "args"; + type: { + defined: "AdminApproveMultisigProposalArgs"; + }; }, ]; - args: []; }, { name: "adminExecuteMultisigProposal"; @@ -1697,6 +1699,18 @@ export type Futarchy = { ]; }; }, + { + name: "AdminApproveMultisigProposalArgs"; + type: { + kind: "struct"; + fields: [ + { + name: "transactionIndex"; + type: "u64"; + }, + ]; + }; + }, { name: "ConditionalSwapParams"; type: { @@ -4488,17 +4502,19 @@ export const IDL: Futarchy = { isSigner: false, }, { - name: "squadsMultisigVaultTransaction", + name: "squadsMultisigProgram", isMut: false, isSigner: false, }, + ], + args: [ { - name: "squadsMultisigProgram", - isMut: false, - isSigner: false, + name: "args", + type: { + defined: "AdminApproveMultisigProposalArgs", + }, }, ], - args: [], }, { name: "adminExecuteMultisigProposal", @@ -4981,6 +4997,18 @@ export const IDL: Futarchy = { ], }, }, + { + name: "AdminApproveMultisigProposalArgs", + type: { + kind: "struct", + fields: [ + { + name: "transactionIndex", + type: "u64", + }, + ], + }, + }, { name: "ConditionalSwapParams", type: { diff --git a/tests/futarchy/unit/adminApproveMultisigProposal.test.ts b/tests/futarchy/unit/adminApproveMultisigProposal.test.ts index eb9831db..0565f7ac 100644 --- a/tests/futarchy/unit/adminApproveMultisigProposal.test.ts +++ b/tests/futarchy/unit/adminApproveMultisigProposal.test.ts @@ -9,6 +9,7 @@ import { expectError, setupBasicDao } from "../../utils.js"; import { assert } from "chai"; import * as multisig from "@sqds/multisig"; import { createMemoInstruction } from "@solana/spl-memo"; +import BN from "bn.js"; export default function suite() { let META: PublicKey, USDC: PublicKey, dao: PublicKey; @@ -96,12 +97,11 @@ export default function suite() { ); await this.futarchy.autocrat.methods - .adminApproveMultisigProposal() + .adminApproveMultisigProposal({ transactionIndex: new BN(1) }) .accounts({ dao: dao, squadsMultisig: daoAccount.squadsMultisig, squadsMultisigProposal: squadsProposalPda, - squadsMultisigVaultTransaction: vaultTransactionPda, admin: this.payer.publicKey, squadsMultisigProgram: multisig.PROGRAM_ID, }) @@ -228,12 +228,13 @@ export default function suite() { // Approve and execute the config transaction using the new split instructions await this.futarchy.autocrat.methods - .adminApproveMultisigProposal() + .adminApproveMultisigProposal({ + transactionIndex: new BN(configTransactionIndex.toString()), + }) .accounts({ dao: dao, squadsMultisig: daoAccount.squadsMultisig, squadsMultisigProposal: squadsConfigProposalPda, - squadsMultisigVaultTransaction: vaultConfigTransactionPda, admin: this.payer.publicKey, squadsMultisigProgram: multisig.PROGRAM_ID, }) @@ -278,12 +279,11 @@ export default function suite() { ); await this.futarchy.autocrat.methods - .adminApproveMultisigProposal() + .adminApproveMultisigProposal({ transactionIndex: new BN(1) }) .accounts({ dao: dao, squadsMultisig: daoAccount.squadsMultisig, squadsMultisigProposal: squadsInvalidatedProposalPda, - squadsMultisigVaultTransaction: vaultInvalidatedTransactionPda, admin: this.payer.publicKey, squadsMultisigProgram: multisig.PROGRAM_ID, }) diff --git a/tests/futarchy/unit/adminExecuteMultisigProposal.test.ts b/tests/futarchy/unit/adminExecuteMultisigProposal.test.ts index 3c0fae54..97ab5dab 100644 --- a/tests/futarchy/unit/adminExecuteMultisigProposal.test.ts +++ b/tests/futarchy/unit/adminExecuteMultisigProposal.test.ts @@ -9,6 +9,7 @@ import { expectError, setupBasicDao } from "../../utils.js"; import { assert } from "chai"; import * as multisig from "@sqds/multisig"; import { createMemoInstruction } from "@solana/spl-memo"; +import BN from "bn.js"; export default function suite() { let META: PublicKey, USDC: PublicKey, dao: PublicKey; @@ -110,12 +111,11 @@ export default function suite() { // First approve await this.futarchy.autocrat.methods - .adminApproveMultisigProposal() + .adminApproveMultisigProposal({ transactionIndex: new BN(1) }) .accounts({ dao: dao, squadsMultisig: daoAccount.squadsMultisig, squadsMultisigProposal: squadsProposalPda, - squadsMultisigVaultTransaction: vaultTransactionPda, admin: this.payer.publicKey, squadsMultisigProgram: multisig.PROGRAM_ID, }) From 804ad5829473bead04f03c2fe6ab42915eeb8a17 Mon Sep 17 00:00:00 2001 From: Pileks Date: Mon, 30 Mar 2026 20:45:55 +0200 Subject: [PATCH 2/2] update sdk ver --- sdk/package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/package.json b/sdk/package.json index 96ecb688..bb2ee687 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@metadaoproject/futarchy", - "version": "0.7.3-alpha.1", + "version": "0.7.4-alpha.0", "type": "module", "main": "dist/index.js", "module": "dist/index.js", diff --git a/yarn.lock b/yarn.lock index 784a21db..fc866b3d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -975,7 +975,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@metadaoproject/futarchy@./sdk": - version "0.7.3-alpha.1" + version "0.7.4-alpha.0" dependencies: "@coral-xyz/anchor" "^0.29.0" "@metaplex-foundation/umi" "^0.9.2"