From cf3547d3d3cb4cb1e56aac097f9a30ed48d2642b Mon Sep 17 00:00:00 2001 From: jrooks7 Date: Thu, 26 Jun 2025 15:18:16 -0700 Subject: [PATCH 1/5] fix: changed ownership of lp tokens to proposal from the treasury --- .../src/instructions/finalize_proposal.rs | 16 +++------ .../src/instructions/initialize_proposal.rs | 26 ++++++++------ .../initialize_proposal_with_liquidity.rs | 10 ++++-- sdk/src/v0.4/AutocratClient.ts | 34 +++---------------- sdk/src/v0.4/SharedLiquidityManagerClient.ts | 21 +++--------- sdk/src/v0.4/types/autocrat.ts | 24 ++++++------- .../v0.4/types/shared_liquidity_manager.ts | 20 +++++++++++ 7 files changed, 69 insertions(+), 82 deletions(-) diff --git a/programs/autocrat/src/instructions/finalize_proposal.rs b/programs/autocrat/src/instructions/finalize_proposal.rs index b43701294..31663c382 100644 --- a/programs/autocrat/src/instructions/finalize_proposal.rs +++ b/programs/autocrat/src/instructions/finalize_proposal.rs @@ -14,12 +14,9 @@ pub struct FinalizeProposal<'info> { pub proposal: Account<'info, Proposal>, pub pass_amm: Account<'info, Amm>, pub fail_amm: Account<'info, Amm>, - #[account(has_one = treasury)] pub dao: Box>, #[account(mut)] pub question: Account<'info, Question>, - /// CHECK: it's okay - pub treasury: UncheckedAccount<'info>, #[account( mut, associated_token::mint = pass_amm.lp_mint, @@ -35,13 +32,13 @@ pub struct FinalizeProposal<'info> { #[account( mut, associated_token::mint = pass_amm.lp_mint, - associated_token::authority = dao.treasury, + associated_token::authority = proposal, )] pub pass_lp_vault_account: Box>, #[account( mut, associated_token::mint = fail_amm.lp_mint, - associated_token::authority = dao.treasury, + associated_token::authority = proposal, )] pub fail_lp_vault_account: Box>, pub token_program: Program<'info, Token>, @@ -74,7 +71,6 @@ impl FinalizeProposal<'_> { fail_amm, dao, question, - treasury, pass_lp_user_account, fail_lp_user_account, pass_lp_vault_account, @@ -96,10 +92,6 @@ impl FinalizeProposal<'_> { ]; let proposal_signer = &[&proposal_seeds[..]]; - let dao_key = dao.key(); - let treasury_seeds = &[dao_key.as_ref(), &[dao.treasury_pda_bump]]; - let treasury_signer = &[&treasury_seeds[..]]; - for (lp_tokens_to_unlock, from, to) in [ ( proposal.pass_lp_tokens_locked, @@ -122,10 +114,10 @@ impl FinalizeProposal<'_> { Transfer { from: from.to_account_info(), to: to.to_account_info(), - authority: treasury.to_account_info(), + authority: proposal.to_account_info(), }, ) - .with_signer(treasury_signer), + .with_signer(proposal_signer), lp_tokens_to_unlock, )?; } diff --git a/programs/autocrat/src/instructions/initialize_proposal.rs b/programs/autocrat/src/instructions/initialize_proposal.rs index c6ee7ee8f..c85eec7e2 100644 --- a/programs/autocrat/src/instructions/initialize_proposal.rs +++ b/programs/autocrat/src/instructions/initialize_proposal.rs @@ -2,6 +2,7 @@ use super::*; use amm::state::ONE_MINUTE_IN_SLOTS; use anchor_spl::token::{self, Token, TokenAccount, Transfer}; +use anchor_spl::associated_token::AssociatedToken; #[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)] pub struct InitializeProposalParams { @@ -46,9 +47,9 @@ pub struct InitializeProposal<'info> { )] pub pass_amm: Box>, #[account(constraint = pass_amm.lp_mint == pass_lp_mint.key())] - pub pass_lp_mint: Account<'info, Mint>, + pub pass_lp_mint: Box>, #[account(constraint = fail_amm.lp_mint == fail_lp_mint.key())] - pub fail_lp_mint: Account<'info, Mint>, + pub fail_lp_mint: Box>, #[account( constraint = fail_amm.base_mint == base_vault.conditional_token_mints[FAIL_INDEX], constraint = fail_amm.quote_mint == quote_vault.conditional_token_mints[FAIL_INDEX], @@ -67,21 +68,25 @@ pub struct InitializeProposal<'info> { )] pub fail_lp_user_account: Account<'info, TokenAccount>, #[account( - mut, - associated_token::mint = pass_amm.lp_mint, - associated_token::authority = dao.treasury, + init_if_needed, + payer = proposer, + associated_token::mint = pass_lp_mint, + associated_token::authority = proposal, )] - pub pass_lp_vault_account: Account<'info, TokenAccount>, + pub pass_lp_vault_account: Box>, #[account( - mut, - associated_token::mint = fail_amm.lp_mint, - associated_token::authority = dao.treasury, + init_if_needed, + payer = proposer, + associated_token::mint = fail_lp_mint, + associated_token::authority = proposal, )] - pub fail_lp_vault_account: Account<'info, TokenAccount>, + pub fail_lp_vault_account: Box>, + #[account(mut)] pub proposer: Signer<'info>, #[account(mut)] pub payer: Signer<'info>, pub token_program: Program<'info, Token>, + pub associated_token_program: Program<'info, AssociatedToken>, pub system_program: Program<'info, System>, } @@ -146,6 +151,7 @@ impl InitializeProposal<'_> { payer: _, token_program, system_program: _, + associated_token_program: _, event_authority: _, program: _, } = ctx.accounts; diff --git a/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs b/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs index bd1d00401..8912e702c 100644 --- a/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs +++ b/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs @@ -1,5 +1,6 @@ use anchor_lang::prelude::*; use anchor_spl::token::{Mint, TokenAccount}; +use anchor_spl::associated_token::AssociatedToken; use raydium_cpmm_cpi::cpi::accounts::Withdraw as RaydiumWithdraw; @@ -94,8 +95,11 @@ pub struct InitializeProposalAmmAccounts<'info> { #[account(mut)] pub fail_amm_vault_ata_quote: Box>, #[account(mut)] + /// CHECK: Proposal account that will be initialized by autocrat + pub proposal: UncheckedAccount<'info>, + #[account(init_if_needed, payer = payer, associated_token::mint = pass_lp_mint, associated_token::authority = proposal)] pub proposal_pass_lp_vault: Box>, - #[account(mut)] + #[account(init_if_needed, payer = payer, associated_token::mint = fail_lp_mint, associated_token::authority = proposal)] pub proposal_fail_lp_vault: Box>, pub amm_program: Program<'info, amm::program::Amm>, /// CHECK: verified by amm @@ -154,6 +158,7 @@ pub struct InitializeProposalWithLiquidity<'info> { pub dao: Box>, pub autocrat_program: Program<'info, autocrat::program::Autocrat>, pub system_program: Program<'info, System>, + pub associated_token_program: Program<'info, AssociatedToken>, /// CHECK: verified by autocrat pub autocrat_event_authority: UncheckedAccount<'info>, } @@ -604,6 +609,7 @@ impl InitializeProposalWithLiquidity<'_> { event_authority: ctx.accounts.autocrat_event_authority.to_account_info(), program: ctx.accounts.autocrat_program.to_account_info(), token_program: ctx.accounts.raydium.token_program.to_account_info(), + associated_token_program: ctx.accounts.associated_token_program.to_account_info(), system_program: ctx.accounts.system_program.to_account_info(), }, signer, @@ -623,4 +629,4 @@ impl InitializeProposalWithLiquidity<'_> { Ok(()) } -} +} \ No newline at end of file diff --git a/sdk/src/v0.4/AutocratClient.ts b/sdk/src/v0.4/AutocratClient.ts index 3aa690c9b..5387d862b 100644 --- a/sdk/src/v0.4/AutocratClient.ts +++ b/sdk/src/v0.4/AutocratClient.ts @@ -574,7 +574,6 @@ export class AutocratClient { proposer: PublicKey = this.provider.publicKey ) { let [proposal] = getProposalAddr(this.autocrat.programId, proposer, nonce); - const [daoTreasury] = getDaoTreasuryAddr(this.autocrat.programId, dao); const { baseVault, quoteVault, passAmm, failAmm } = this.getProposalPdas( proposal, baseMint, @@ -593,12 +592,12 @@ export class AutocratClient { const passLpVaultAccount = getAssociatedTokenAddressSync( passLp, - daoTreasury, + proposal, true ); const failLpVaultAccount = getAssociatedTokenAddressSync( failLp, - daoTreasury, + proposal, true ); @@ -633,21 +632,7 @@ export class AutocratClient { passLpVaultAccount, failLpVaultAccount, proposer, - }) - .preInstructions([ - createAssociatedTokenAccountIdempotentInstruction( - proposer, - passLpVaultAccount, - daoTreasury, - passLp - ), - createAssociatedTokenAccountIdempotentInstruction( - proposer, - failLpVaultAccount, - daoTreasury, - failLp - ), - ]); + }); } async finalizeProposal(proposal: PublicKey) { @@ -703,18 +688,9 @@ export class AutocratClient { // quoteVault, passLpUserAccount: getAssociatedTokenAddressSync(passLp, proposer, true), failLpUserAccount: getAssociatedTokenAddressSync(failLp, proposer, true), - passLpVaultAccount: getAssociatedTokenAddressSync( - passLp, - daoTreasury, - true - ), - failLpVaultAccount: getAssociatedTokenAddressSync( - failLp, - daoTreasury, - true - ), + passLpVaultAccount: getAssociatedTokenAddressSync(passLp, proposal, true), + failLpVaultAccount: getAssociatedTokenAddressSync(failLp, proposal, true), vaultProgram: this.vaultClient.vaultProgram.programId, - treasury: daoTreasury, vaultEventAuthority, }); } diff --git a/sdk/src/v0.4/SharedLiquidityManagerClient.ts b/sdk/src/v0.4/SharedLiquidityManagerClient.ts index f85f72c54..55d9bb9b7 100644 --- a/sdk/src/v0.4/SharedLiquidityManagerClient.ts +++ b/sdk/src/v0.4/SharedLiquidityManagerClient.ts @@ -529,14 +529,15 @@ export class SharedLiquidityManagerClient { failAmm, true ), + proposal, proposalPassLpVault: getAssociatedTokenAddressSync( passLpMint, - daoTreasury, + proposal, true ), proposalFailLpVault: getAssociatedTokenAddressSync( failLpMint, - daoTreasury, + proposal, true ), ammProgram: AMM_PROGRAM_ID, @@ -547,21 +548,7 @@ export class SharedLiquidityManagerClient { dao, autocratProgram: AUTOCRAT_PROGRAM_ID, systemProgram: SystemProgram.programId, - }) - .preInstructions([ - createAssociatedTokenAccountIdempotentInstruction( - this.provider.wallet.publicKey, - getAssociatedTokenAddressSync(passLpMint, daoTreasury, true), - daoTreasury, - passLpMint - ), - createAssociatedTokenAccountIdempotentInstruction( - this.provider.wallet.publicKey, - getAssociatedTokenAddressSync(failLpMint, daoTreasury, true), - daoTreasury, - failLpMint - ), - ]); + }); } initializeDraftProposalIx( diff --git a/sdk/src/v0.4/types/autocrat.ts b/sdk/src/v0.4/types/autocrat.ts index 8e76b4c88..a08f6ebbe 100644 --- a/sdk/src/v0.4/types/autocrat.ts +++ b/sdk/src/v0.4/types/autocrat.ts @@ -120,7 +120,7 @@ export type Autocrat = { }, { name: "proposer"; - isMut: false; + isMut: true; isSigner: true; }, { @@ -133,6 +133,11 @@ export type Autocrat = { isMut: false; isSigner: false; }, + { + name: "associatedTokenProgram"; + isMut: false; + isSigner: false; + }, { name: "systemProgram"; isMut: false; @@ -186,11 +191,6 @@ export type Autocrat = { isMut: true; isSigner: false; }, - { - name: "treasury"; - isMut: false; - isSigner: false; - }, { name: "passLpUserAccount"; isMut: true; @@ -1142,7 +1142,7 @@ export const IDL: Autocrat = { }, { name: "proposer", - isMut: false, + isMut: true, isSigner: true, }, { @@ -1155,6 +1155,11 @@ export const IDL: Autocrat = { isMut: false, isSigner: false, }, + { + name: "associatedTokenProgram", + isMut: false, + isSigner: false, + }, { name: "systemProgram", isMut: false, @@ -1208,11 +1213,6 @@ export const IDL: Autocrat = { isMut: true, isSigner: false, }, - { - name: "treasury", - isMut: false, - isSigner: false, - }, { name: "passLpUserAccount", isMut: true, diff --git a/sdk/src/v0.4/types/shared_liquidity_manager.ts b/sdk/src/v0.4/types/shared_liquidity_manager.ts index b351a9fa5..a4a2d4f8d 100644 --- a/sdk/src/v0.4/types/shared_liquidity_manager.ts +++ b/sdk/src/v0.4/types/shared_liquidity_manager.ts @@ -838,6 +838,11 @@ export type SharedLiquidityManager = { isMut: true; isSigner: false; }, + { + name: "proposal"; + isMut: true; + isSigner: false; + }, { name: "proposalPassLpVault"; isMut: true; @@ -905,6 +910,11 @@ export type SharedLiquidityManager = { isMut: false; isSigner: false; }, + { + name: "associatedTokenProgram"; + isMut: false; + isSigner: false; + }, { name: "autocratEventAuthority"; isMut: false; @@ -2593,6 +2603,11 @@ export const IDL: SharedLiquidityManager = { isMut: true, isSigner: false, }, + { + name: "proposal", + isMut: true, + isSigner: false, + }, { name: "proposalPassLpVault", isMut: true, @@ -2660,6 +2675,11 @@ export const IDL: SharedLiquidityManager = { isMut: false, isSigner: false, }, + { + name: "associatedTokenProgram", + isMut: false, + isSigner: false, + }, { name: "autocratEventAuthority", isMut: false, From 1aee3bcc1698b73b0a5c74f7f2f8ac196df5ddab Mon Sep 17 00:00:00 2001 From: jrooks7 Date: Thu, 26 Jun 2025 15:29:21 -0700 Subject: [PATCH 2/5] fix: testing tests --- .../src/instructions/initialize_proposal_with_liquidity.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs b/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs index 8912e702c..7acf4ff30 100644 --- a/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs +++ b/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs @@ -163,6 +163,7 @@ pub struct InitializeProposalWithLiquidity<'info> { pub autocrat_event_authority: UncheckedAccount<'info>, } + impl InitializeProposalWithLiquidity<'_> { pub fn validate(&self) -> Result<()> { // Check stake threshold From 990f6cd1f8d9cb25dc444be04b362842d44bd8dd Mon Sep 17 00:00:00 2001 From: jrooks7 Date: Thu, 26 Jun 2025 16:38:49 -0700 Subject: [PATCH 3/5] fix: reordered program order in struct definitions --- programs/autocrat/src/instructions/initialize_proposal.rs | 2 +- .../instructions/initialize_proposal_with_liquidity.rs | 2 +- sdk/src/v0.4/types/autocrat.ts | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/programs/autocrat/src/instructions/initialize_proposal.rs b/programs/autocrat/src/instructions/initialize_proposal.rs index c85eec7e2..2d7947f6c 100644 --- a/programs/autocrat/src/instructions/initialize_proposal.rs +++ b/programs/autocrat/src/instructions/initialize_proposal.rs @@ -86,8 +86,8 @@ pub struct InitializeProposal<'info> { #[account(mut)] pub payer: Signer<'info>, pub token_program: Program<'info, Token>, - pub associated_token_program: Program<'info, AssociatedToken>, pub system_program: Program<'info, System>, + pub associated_token_program: Program<'info, AssociatedToken>, } impl InitializeProposal<'_> { diff --git a/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs b/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs index 7acf4ff30..6a060d46c 100644 --- a/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs +++ b/programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs @@ -610,8 +610,8 @@ impl InitializeProposalWithLiquidity<'_> { event_authority: ctx.accounts.autocrat_event_authority.to_account_info(), program: ctx.accounts.autocrat_program.to_account_info(), token_program: ctx.accounts.raydium.token_program.to_account_info(), - associated_token_program: ctx.accounts.associated_token_program.to_account_info(), system_program: ctx.accounts.system_program.to_account_info(), + associated_token_program: ctx.accounts.associated_token_program.to_account_info(), }, signer, ), diff --git a/sdk/src/v0.4/types/autocrat.ts b/sdk/src/v0.4/types/autocrat.ts index a08f6ebbe..fcda41be9 100644 --- a/sdk/src/v0.4/types/autocrat.ts +++ b/sdk/src/v0.4/types/autocrat.ts @@ -134,12 +134,12 @@ export type Autocrat = { isSigner: false; }, { - name: "associatedTokenProgram"; + name: "systemProgram"; isMut: false; isSigner: false; }, { - name: "systemProgram"; + name: "associatedTokenProgram"; isMut: false; isSigner: false; }, @@ -1156,12 +1156,12 @@ export const IDL: Autocrat = { isSigner: false, }, { - name: "associatedTokenProgram", + name: "systemProgram", isMut: false, isSigner: false, }, { - name: "systemProgram", + name: "associatedTokenProgram", isMut: false, isSigner: false, }, From 26ba7fb9966ce7fe2c527a0f27f324d791992324 Mon Sep 17 00:00:00 2001 From: jrooks7 Date: Thu, 26 Jun 2025 17:04:42 -0700 Subject: [PATCH 4/5] v0.4.0-alpha.75 --- sdk/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/package.json b/sdk/package.json index ad0f1bce5..686a7f68d 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@metadaoproject/futarchy", - "version": "0.4.0-alpha.74", + "version": "0.4.0-alpha.75", "type": "module", "main": "dist/index.js", "module": "dist/index.js", From 1230055816b482cbba1a82fcd01b21816f80f6a6 Mon Sep 17 00:00:00 2001 From: jrooks7 Date: Thu, 26 Jun 2025 17:05:26 -0700 Subject: [PATCH 5/5] fix: bumping the sdk --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9e9f079e2..d2e9cc222 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "dependencies": { "@coral-xyz/anchor": "0.29.0", "@inquirer/prompts": "^7.3.3", - "@metadaoproject/futarchy": "0.4.0-alpha.74", + "@metadaoproject/futarchy": "0.4.0-alpha.75", "@metaplex-foundation/mpl-token-metadata": "^3.2.0", "@metaplex-foundation/umi": "^0.9.1", "@metaplex-foundation/umi-bundle-defaults": "^0.9.1", diff --git a/yarn.lock b/yarn.lock index 409b49647..350746d34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -786,10 +786,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@metadaoproject/futarchy@0.4.0-alpha.74": - version "0.4.0-alpha.74" - resolved "https://registry.yarnpkg.com/@metadaoproject/futarchy/-/futarchy-0.4.0-alpha.74.tgz#f43d7fa41f9d49a6283ad3723b5db0d16d4cc8a9" - integrity sha512-CckorrrtCAAe4EyYdSD049CwNEkPpXkJdNyFJZwpbghjtgJ6dwHNpEZ7npa2yTNA+dng3rFz9KiriNHqa4H4eQ== +"@metadaoproject/futarchy@0.4.0-alpha.75": + version "0.4.0-alpha.75" + resolved "https://registry.yarnpkg.com/@metadaoproject/futarchy/-/futarchy-0.4.0-alpha.75.tgz#85573ecfe8f6ab2fd7eeb03eb41205c26693e176" + integrity sha512-wuyinxlh+TIMTddl5DVbM2nyfG8wirwmI6F+DOCvCPpxjHvMX6YnbdoXopdo1Aoa8sgmufZn9rcnAQ4eQfdL7Q== dependencies: "@coral-xyz/anchor" "^0.29.0" "@metaplex-foundation/umi" "^0.9.2"