Skip to content

Commit bcef04c

Browse files
author
jrooks7
authored
Change ownership of lp tokens to proposal from the treasury (#303)
* fix: changed ownership of lp tokens to proposal from the treasury * fix: testing tests * fix: reordered program order in struct definitions * v0.4.0-alpha.75 * fix: bumping the sdk
1 parent ac70b3c commit bcef04c

10 files changed

Lines changed: 76 additions & 88 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"dependencies": {
1414
"@coral-xyz/anchor": "0.29.0",
1515
"@inquirer/prompts": "^7.3.3",
16-
"@metadaoproject/futarchy": "0.4.0-alpha.74",
16+
"@metadaoproject/futarchy": "0.4.0-alpha.75",
1717
"@metaplex-foundation/mpl-token-metadata": "^3.2.0",
1818
"@metaplex-foundation/umi": "^0.9.1",
1919
"@metaplex-foundation/umi-bundle-defaults": "^0.9.1",

programs/autocrat/src/instructions/finalize_proposal.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,9 @@ pub struct FinalizeProposal<'info> {
1414
pub proposal: Account<'info, Proposal>,
1515
pub pass_amm: Account<'info, Amm>,
1616
pub fail_amm: Account<'info, Amm>,
17-
#[account(has_one = treasury)]
1817
pub dao: Box<Account<'info, Dao>>,
1918
#[account(mut)]
2019
pub question: Account<'info, Question>,
21-
/// CHECK: it's okay
22-
pub treasury: UncheckedAccount<'info>,
2320
#[account(
2421
mut,
2522
associated_token::mint = pass_amm.lp_mint,
@@ -35,13 +32,13 @@ pub struct FinalizeProposal<'info> {
3532
#[account(
3633
mut,
3734
associated_token::mint = pass_amm.lp_mint,
38-
associated_token::authority = dao.treasury,
35+
associated_token::authority = proposal,
3936
)]
4037
pub pass_lp_vault_account: Box<Account<'info, TokenAccount>>,
4138
#[account(
4239
mut,
4340
associated_token::mint = fail_amm.lp_mint,
44-
associated_token::authority = dao.treasury,
41+
associated_token::authority = proposal,
4542
)]
4643
pub fail_lp_vault_account: Box<Account<'info, TokenAccount>>,
4744
pub token_program: Program<'info, Token>,
@@ -74,7 +71,6 @@ impl FinalizeProposal<'_> {
7471
fail_amm,
7572
dao,
7673
question,
77-
treasury,
7874
pass_lp_user_account,
7975
fail_lp_user_account,
8076
pass_lp_vault_account,
@@ -96,10 +92,6 @@ impl FinalizeProposal<'_> {
9692
];
9793
let proposal_signer = &[&proposal_seeds[..]];
9894

99-
let dao_key = dao.key();
100-
let treasury_seeds = &[dao_key.as_ref(), &[dao.treasury_pda_bump]];
101-
let treasury_signer = &[&treasury_seeds[..]];
102-
10395
for (lp_tokens_to_unlock, from, to) in [
10496
(
10597
proposal.pass_lp_tokens_locked,
@@ -122,10 +114,10 @@ impl FinalizeProposal<'_> {
122114
Transfer {
123115
from: from.to_account_info(),
124116
to: to.to_account_info(),
125-
authority: treasury.to_account_info(),
117+
authority: proposal.to_account_info(),
126118
},
127119
)
128-
.with_signer(treasury_signer),
120+
.with_signer(proposal_signer),
129121
lp_tokens_to_unlock,
130122
)?;
131123
}

programs/autocrat/src/instructions/initialize_proposal.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::*;
22

33
use amm::state::ONE_MINUTE_IN_SLOTS;
44
use anchor_spl::token::{self, Token, TokenAccount, Transfer};
5+
use anchor_spl::associated_token::AssociatedToken;
56

67
#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)]
78
pub struct InitializeProposalParams {
@@ -46,9 +47,9 @@ pub struct InitializeProposal<'info> {
4647
)]
4748
pub pass_amm: Box<Account<'info, Amm>>,
4849
#[account(constraint = pass_amm.lp_mint == pass_lp_mint.key())]
49-
pub pass_lp_mint: Account<'info, Mint>,
50+
pub pass_lp_mint: Box<Account<'info, Mint>>,
5051
#[account(constraint = fail_amm.lp_mint == fail_lp_mint.key())]
51-
pub fail_lp_mint: Account<'info, Mint>,
52+
pub fail_lp_mint: Box<Account<'info, Mint>>,
5253
#[account(
5354
constraint = fail_amm.base_mint == base_vault.conditional_token_mints[FAIL_INDEX],
5455
constraint = fail_amm.quote_mint == quote_vault.conditional_token_mints[FAIL_INDEX],
@@ -67,22 +68,26 @@ pub struct InitializeProposal<'info> {
6768
)]
6869
pub fail_lp_user_account: Account<'info, TokenAccount>,
6970
#[account(
70-
mut,
71-
associated_token::mint = pass_amm.lp_mint,
72-
associated_token::authority = dao.treasury,
71+
init_if_needed,
72+
payer = proposer,
73+
associated_token::mint = pass_lp_mint,
74+
associated_token::authority = proposal,
7375
)]
74-
pub pass_lp_vault_account: Account<'info, TokenAccount>,
76+
pub pass_lp_vault_account: Box<Account<'info, TokenAccount>>,
7577
#[account(
76-
mut,
77-
associated_token::mint = fail_amm.lp_mint,
78-
associated_token::authority = dao.treasury,
78+
init_if_needed,
79+
payer = proposer,
80+
associated_token::mint = fail_lp_mint,
81+
associated_token::authority = proposal,
7982
)]
80-
pub fail_lp_vault_account: Account<'info, TokenAccount>,
83+
pub fail_lp_vault_account: Box<Account<'info, TokenAccount>>,
84+
#[account(mut)]
8185
pub proposer: Signer<'info>,
8286
#[account(mut)]
8387
pub payer: Signer<'info>,
8488
pub token_program: Program<'info, Token>,
8589
pub system_program: Program<'info, System>,
90+
pub associated_token_program: Program<'info, AssociatedToken>,
8691
}
8792

8893
impl InitializeProposal<'_> {
@@ -146,6 +151,7 @@ impl InitializeProposal<'_> {
146151
payer: _,
147152
token_program,
148153
system_program: _,
154+
associated_token_program: _,
149155
event_authority: _,
150156
program: _,
151157
} = ctx.accounts;

programs/shared_liquidity_manager/src/instructions/initialize_proposal_with_liquidity.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use anchor_lang::prelude::*;
22
use anchor_spl::token::{Mint, TokenAccount};
3+
use anchor_spl::associated_token::AssociatedToken;
34

45
use raydium_cpmm_cpi::cpi::accounts::Withdraw as RaydiumWithdraw;
56

@@ -94,8 +95,11 @@ pub struct InitializeProposalAmmAccounts<'info> {
9495
#[account(mut)]
9596
pub fail_amm_vault_ata_quote: Box<Account<'info, anchor_spl::token::TokenAccount>>,
9697
#[account(mut)]
98+
/// CHECK: Proposal account that will be initialized by autocrat
99+
pub proposal: UncheckedAccount<'info>,
100+
#[account(init_if_needed, payer = payer, associated_token::mint = pass_lp_mint, associated_token::authority = proposal)]
97101
pub proposal_pass_lp_vault: Box<Account<'info, anchor_spl::token::TokenAccount>>,
98-
#[account(mut)]
102+
#[account(init_if_needed, payer = payer, associated_token::mint = fail_lp_mint, associated_token::authority = proposal)]
99103
pub proposal_fail_lp_vault: Box<Account<'info, anchor_spl::token::TokenAccount>>,
100104
pub amm_program: Program<'info, amm::program::Amm>,
101105
/// CHECK: verified by amm
@@ -154,10 +158,12 @@ pub struct InitializeProposalWithLiquidity<'info> {
154158
pub dao: Box<Account<'info, autocrat::state::Dao>>,
155159
pub autocrat_program: Program<'info, autocrat::program::Autocrat>,
156160
pub system_program: Program<'info, System>,
161+
pub associated_token_program: Program<'info, AssociatedToken>,
157162
/// CHECK: verified by autocrat
158163
pub autocrat_event_authority: UncheckedAccount<'info>,
159164
}
160165

166+
161167
impl InitializeProposalWithLiquidity<'_> {
162168
pub fn validate(&self) -> Result<()> {
163169
// Check stake threshold
@@ -605,6 +611,7 @@ impl InitializeProposalWithLiquidity<'_> {
605611
program: ctx.accounts.autocrat_program.to_account_info(),
606612
token_program: ctx.accounts.raydium.token_program.to_account_info(),
607613
system_program: ctx.accounts.system_program.to_account_info(),
614+
associated_token_program: ctx.accounts.associated_token_program.to_account_info(),
608615
},
609616
signer,
610617
),
@@ -623,4 +630,4 @@ impl InitializeProposalWithLiquidity<'_> {
623630

624631
Ok(())
625632
}
626-
}
633+
}

sdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@metadaoproject/futarchy",
3-
"version": "0.4.0-alpha.74",
3+
"version": "0.4.0-alpha.75",
44
"type": "module",
55
"main": "dist/index.js",
66
"module": "dist/index.js",

sdk/src/v0.4/AutocratClient.ts

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,6 @@ export class AutocratClient {
574574
proposer: PublicKey = this.provider.publicKey
575575
) {
576576
let [proposal] = getProposalAddr(this.autocrat.programId, proposer, nonce);
577-
const [daoTreasury] = getDaoTreasuryAddr(this.autocrat.programId, dao);
578577
const { baseVault, quoteVault, passAmm, failAmm } = this.getProposalPdas(
579578
proposal,
580579
baseMint,
@@ -593,12 +592,12 @@ export class AutocratClient {
593592

594593
const passLpVaultAccount = getAssociatedTokenAddressSync(
595594
passLp,
596-
daoTreasury,
595+
proposal,
597596
true
598597
);
599598
const failLpVaultAccount = getAssociatedTokenAddressSync(
600599
failLp,
601-
daoTreasury,
600+
proposal,
602601
true
603602
);
604603

@@ -633,21 +632,7 @@ export class AutocratClient {
633632
passLpVaultAccount,
634633
failLpVaultAccount,
635634
proposer,
636-
})
637-
.preInstructions([
638-
createAssociatedTokenAccountIdempotentInstruction(
639-
proposer,
640-
passLpVaultAccount,
641-
daoTreasury,
642-
passLp
643-
),
644-
createAssociatedTokenAccountIdempotentInstruction(
645-
proposer,
646-
failLpVaultAccount,
647-
daoTreasury,
648-
failLp
649-
),
650-
]);
635+
});
651636
}
652637

653638
async finalizeProposal(proposal: PublicKey) {
@@ -703,18 +688,9 @@ export class AutocratClient {
703688
// quoteVault,
704689
passLpUserAccount: getAssociatedTokenAddressSync(passLp, proposer, true),
705690
failLpUserAccount: getAssociatedTokenAddressSync(failLp, proposer, true),
706-
passLpVaultAccount: getAssociatedTokenAddressSync(
707-
passLp,
708-
daoTreasury,
709-
true
710-
),
711-
failLpVaultAccount: getAssociatedTokenAddressSync(
712-
failLp,
713-
daoTreasury,
714-
true
715-
),
691+
passLpVaultAccount: getAssociatedTokenAddressSync(passLp, proposal, true),
692+
failLpVaultAccount: getAssociatedTokenAddressSync(failLp, proposal, true),
716693
vaultProgram: this.vaultClient.vaultProgram.programId,
717-
treasury: daoTreasury,
718694
vaultEventAuthority,
719695
});
720696
}

sdk/src/v0.4/SharedLiquidityManagerClient.ts

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -529,14 +529,15 @@ export class SharedLiquidityManagerClient {
529529
failAmm,
530530
true
531531
),
532+
proposal,
532533
proposalPassLpVault: getAssociatedTokenAddressSync(
533534
passLpMint,
534-
daoTreasury,
535+
proposal,
535536
true
536537
),
537538
proposalFailLpVault: getAssociatedTokenAddressSync(
538539
failLpMint,
539-
daoTreasury,
540+
proposal,
540541
true
541542
),
542543
ammProgram: AMM_PROGRAM_ID,
@@ -547,21 +548,7 @@ export class SharedLiquidityManagerClient {
547548
dao,
548549
autocratProgram: AUTOCRAT_PROGRAM_ID,
549550
systemProgram: SystemProgram.programId,
550-
})
551-
.preInstructions([
552-
createAssociatedTokenAccountIdempotentInstruction(
553-
this.provider.wallet.publicKey,
554-
getAssociatedTokenAddressSync(passLpMint, daoTreasury, true),
555-
daoTreasury,
556-
passLpMint
557-
),
558-
createAssociatedTokenAccountIdempotentInstruction(
559-
this.provider.wallet.publicKey,
560-
getAssociatedTokenAddressSync(failLpMint, daoTreasury, true),
561-
daoTreasury,
562-
failLpMint
563-
),
564-
]);
551+
});
565552
}
566553

567554
initializeDraftProposalIx(

sdk/src/v0.4/types/autocrat.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ export type Autocrat = {
120120
},
121121
{
122122
name: "proposer";
123-
isMut: false;
123+
isMut: true;
124124
isSigner: true;
125125
},
126126
{
@@ -138,6 +138,11 @@ export type Autocrat = {
138138
isMut: false;
139139
isSigner: false;
140140
},
141+
{
142+
name: "associatedTokenProgram";
143+
isMut: false;
144+
isSigner: false;
145+
},
141146
{
142147
name: "eventAuthority";
143148
isMut: false;
@@ -186,11 +191,6 @@ export type Autocrat = {
186191
isMut: true;
187192
isSigner: false;
188193
},
189-
{
190-
name: "treasury";
191-
isMut: false;
192-
isSigner: false;
193-
},
194194
{
195195
name: "passLpUserAccount";
196196
isMut: true;
@@ -1142,7 +1142,7 @@ export const IDL: Autocrat = {
11421142
},
11431143
{
11441144
name: "proposer",
1145-
isMut: false,
1145+
isMut: true,
11461146
isSigner: true,
11471147
},
11481148
{
@@ -1160,6 +1160,11 @@ export const IDL: Autocrat = {
11601160
isMut: false,
11611161
isSigner: false,
11621162
},
1163+
{
1164+
name: "associatedTokenProgram",
1165+
isMut: false,
1166+
isSigner: false,
1167+
},
11631168
{
11641169
name: "eventAuthority",
11651170
isMut: false,
@@ -1208,11 +1213,6 @@ export const IDL: Autocrat = {
12081213
isMut: true,
12091214
isSigner: false,
12101215
},
1211-
{
1212-
name: "treasury",
1213-
isMut: false,
1214-
isSigner: false,
1215-
},
12161216
{
12171217
name: "passLpUserAccount",
12181218
isMut: true,

0 commit comments

Comments
 (0)