Skip to content

Commit 6902941

Browse files
committed
Add expected value check and lint
1 parent 9db1cec commit 6902941

2 files changed

Lines changed: 89 additions & 37 deletions

File tree

programs/autocrat_v0/src/lib.rs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use anchor_lang::prelude::*;
22
use anchor_lang::solana_program;
33
use anchor_spl::token::Mint;
4-
use openbook_v2::state::Market;
5-
use openbook_twap::TWAPMarket;
64
use conditional_vault::cpi::accounts::SettleConditionalVault;
75
use conditional_vault::program::ConditionalVault as ConditionalVaultProgram;
86
use conditional_vault::ConditionalVault as ConditionalVaultAccount;
97
use conditional_vault::VaultStatus;
8+
use openbook_twap::TWAPMarket;
9+
use openbook_v2::state::Market;
1010
use solana_program::instruction::Instruction;
1111
#[cfg(not(feature = "no-entrypoint"))]
1212
use solana_security_txt::security_txt;
@@ -127,11 +127,13 @@ pub mod autocrat_v0 {
127127
let openbook_twap_fail_market = &ctx.accounts.openbook_twap_fail_market;
128128

129129
require!(
130-
openbook_pass_market.base_mint == ctx.accounts.base_vault.conditional_on_finalize_token_mint,
130+
openbook_pass_market.base_mint
131+
== ctx.accounts.base_vault.conditional_on_finalize_token_mint,
131132
AutocratError::InvalidMarket
132133
);
133134
require!(
134-
openbook_pass_market.quote_mint == ctx.accounts.quote_vault.conditional_on_finalize_token_mint,
135+
openbook_pass_market.quote_mint
136+
== ctx.accounts.quote_vault.conditional_on_finalize_token_mint,
135137
AutocratError::InvalidMarket
136138
);
137139

@@ -163,11 +165,13 @@ pub mod autocrat_v0 {
163165
);
164166

165167
require!(
166-
openbook_fail_market.base_mint == ctx.accounts.base_vault.conditional_on_revert_token_mint,
168+
openbook_fail_market.base_mint
169+
== ctx.accounts.base_vault.conditional_on_revert_token_mint,
167170
AutocratError::InvalidMarket
168171
);
169172
require!(
170-
openbook_fail_market.quote_mint == ctx.accounts.quote_vault.conditional_on_revert_token_mint,
173+
openbook_fail_market.quote_mint
174+
== ctx.accounts.quote_vault.conditional_on_revert_token_mint,
171175
AutocratError::InvalidMarket
172176
);
173177
require!(
@@ -200,15 +204,21 @@ pub mod autocrat_v0 {
200204
let openbook_twap_fail_market = &ctx.accounts.openbook_twap_fail_market;
201205

202206
require!(
203-
openbook_twap_pass_market.twap_oracle.initial_slot + 50
204-
>= clock.slot,
207+
openbook_twap_pass_market.twap_oracle.initial_slot + 50 >= clock.slot,
205208
AutocratError::TWAPMarketTooOld
206209
);
207210
require!(
208-
openbook_twap_fail_market.twap_oracle.initial_slot + 50
209-
>= clock.slot,
211+
openbook_twap_fail_market.twap_oracle.initial_slot + 50 >= clock.slot,
210212
AutocratError::TWAPMarketTooOld
211213
);
214+
require!(
215+
openbook_twap_pass_market.twap_oracle.expected_value == 1000,
216+
AutocratError::TWAPMarketInvalidExpectedValue
217+
);
218+
require!(
219+
openbook_twap_fail_market.twap_oracle.expected_value == 1000,
220+
AutocratError::TWAPMarketInvalidExpectedValue
221+
);
212222

213223
let dao = &mut ctx.accounts.dao;
214224
let proposal = &mut ctx.accounts.proposal;
@@ -230,7 +240,6 @@ pub mod autocrat_v0 {
230240
proposal.quote_vault = ctx.accounts.quote_vault.key();
231241
proposal.base_vault = ctx.accounts.base_vault.key();
232242

233-
234243
let slots_passed = clock.slot - dao.last_proposal_slot;
235244
let burn_amount = dao.base_burn_lamports.saturating_sub(
236245
dao.burn_decay_per_slot_lamports
@@ -299,7 +308,6 @@ pub mod autocrat_v0 {
299308
let fail_market_slots_passed =
300309
openbook_twap_fail_market.twap_oracle.last_updated_slot - proposal.slot_enqueued;
301310

302-
303311
require!(
304312
pass_market_slots_passed >= TEN_DAYS_IN_SLOTS,
305313
AutocratError::MarketsTooYoung
@@ -318,7 +326,7 @@ pub mod autocrat_v0 {
318326
let threshold = (fail_market_twap
319327
* (MAX_BPS + ctx.accounts.dao.pass_threshold_bps) as u128)
320328
/ MAX_BPS as u128;
321-
329+
322330
if pass_market_twap > threshold {
323331
proposal.state = ProposalState::Passed;
324332

@@ -450,7 +458,7 @@ pub struct InitializeProposal<'info> {
450458

451459
#[derive(Accounts)]
452460
pub struct FinalizeProposal<'info> {
453-
#[account(mut,
461+
#[account(mut,
454462
has_one = base_vault,
455463
has_one = quote_vault,
456464
has_one = openbook_twap_pass_market,
@@ -510,6 +518,8 @@ pub enum AutocratError {
510518
InvalidMarket,
511519
#[msg("`TWAPMarket` must have an `initial_slot` within 50 slots of the proposal's `slot_enqueued`")]
512520
TWAPMarketTooOld,
521+
#[msg("`TWAPMarket` must have an expected value of 1000, or 0.1 USDC per META")]
522+
TWAPMarketInvalidExpectedValue,
513523
#[msg("One of the vaults has an invalid `settlement_authority`")]
514524
InvalidSettlementAuthority,
515525
#[msg("Proposal is too young to be executed or rejected")]

programs/conditional_vault/src/lib.rs

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,10 @@ pub mod conditional_vault {
7575
vault.underlying_token_mint = ctx.accounts.underlying_token_mint.key();
7676
vault.nonce = nonce;
7777
vault.underlying_token_account = ctx.accounts.vault_underlying_token_account.key();
78-
vault.conditional_on_finalize_token_mint = ctx.accounts.conditional_on_finalize_token_mint.key();
79-
vault.conditional_on_revert_token_mint = ctx.accounts.conditional_on_revert_token_mint.key();
78+
vault.conditional_on_finalize_token_mint =
79+
ctx.accounts.conditional_on_finalize_token_mint.key();
80+
vault.conditional_on_revert_token_mint =
81+
ctx.accounts.conditional_on_revert_token_mint.key();
8082
vault.pda_bump = *ctx.bumps.get("vault").unwrap();
8183

8284
Ok(())
@@ -92,12 +94,13 @@ pub mod conditional_vault {
9294
Ok(())
9395
}
9496

95-
9697
pub fn mint_conditional_tokens(ctx: Context<MintConditionalTokens>, amount: u64) -> Result<()> {
9798
let accs = &ctx.accounts;
9899

99-
let pre_user_conditional_on_finalize_balance = accs.user_conditional_on_finalize_token_account.amount;
100-
let pre_user_conditional_on_revert_balance = accs.user_conditional_on_revert_token_account.amount;
100+
let pre_user_conditional_on_finalize_balance =
101+
accs.user_conditional_on_finalize_token_account.amount;
102+
let pre_user_conditional_on_revert_balance =
103+
accs.user_conditional_on_revert_token_account.amount;
101104
let pre_vault_underlying_balance = accs.vault_underlying_token_account.amount;
102105
let pre_finalize_mint_supply = accs.conditional_on_finalize_token_mint.supply;
103106
let pre_revert_mint_supply = accs.conditional_on_revert_token_mint.supply;
@@ -124,7 +127,9 @@ pub mod conditional_vault {
124127
accs.token_program.to_account_info(),
125128
MintTo {
126129
mint: accs.conditional_on_finalize_token_mint.to_account_info(),
127-
to: accs.user_conditional_on_finalize_token_account.to_account_info(),
130+
to: accs
131+
.user_conditional_on_finalize_token_account
132+
.to_account_info(),
128133
authority: accs.vault.to_account_info(),
129134
},
130135
signer,
@@ -137,30 +142,46 @@ pub mod conditional_vault {
137142
accs.token_program.to_account_info(),
138143
MintTo {
139144
mint: accs.conditional_on_revert_token_mint.to_account_info(),
140-
to: accs.user_conditional_on_revert_token_account.to_account_info(),
145+
to: accs
146+
.user_conditional_on_revert_token_account
147+
.to_account_info(),
141148
authority: accs.vault.to_account_info(),
142149
},
143150
signer,
144151
),
145152
amount,
146153
)?;
147154

148-
ctx.accounts.user_conditional_on_finalize_token_account.reload()?;
149-
ctx.accounts.user_conditional_on_revert_token_account.reload()?;
155+
ctx.accounts
156+
.user_conditional_on_finalize_token_account
157+
.reload()?;
158+
ctx.accounts
159+
.user_conditional_on_revert_token_account
160+
.reload()?;
150161
ctx.accounts.vault_underlying_token_account.reload()?;
151162
ctx.accounts.conditional_on_finalize_token_mint.reload()?;
152163
ctx.accounts.conditional_on_revert_token_mint.reload()?;
153164

154-
let post_user_conditional_on_finalize_balance = ctx.accounts.user_conditional_on_finalize_token_account.amount;
155-
let post_user_conditional_on_revert_balance = ctx.accounts.user_conditional_on_revert_token_account.amount;
165+
let post_user_conditional_on_finalize_balance = ctx
166+
.accounts
167+
.user_conditional_on_finalize_token_account
168+
.amount;
169+
let post_user_conditional_on_revert_balance =
170+
ctx.accounts.user_conditional_on_revert_token_account.amount;
156171
let post_vault_underlying_balance = ctx.accounts.vault_underlying_token_account.amount;
157172
let post_finalize_mint_supply = ctx.accounts.conditional_on_finalize_token_mint.supply;
158173
let post_revert_mint_supply = ctx.accounts.conditional_on_revert_token_mint.supply;
159174

160175
// Only the paranoid survive ;)
161176
assert!(post_vault_underlying_balance == pre_vault_underlying_balance + amount);
162-
assert!(post_user_conditional_on_finalize_balance == pre_user_conditional_on_finalize_balance + amount);
163-
assert!(post_user_conditional_on_revert_balance == pre_user_conditional_on_revert_balance + amount);
177+
assert!(
178+
post_user_conditional_on_finalize_balance
179+
== pre_user_conditional_on_finalize_balance + amount
180+
);
181+
assert!(
182+
post_user_conditional_on_revert_balance
183+
== pre_user_conditional_on_revert_balance + amount
184+
);
164185
assert!(post_finalize_mint_supply == pre_finalize_mint_supply + amount);
165186
assert!(post_revert_mint_supply == pre_revert_mint_supply + amount);
166187

@@ -183,7 +204,8 @@ pub mod conditional_vault {
183204
let seeds = generate_vault_seeds!(vault);
184205
let signer = &[&seeds[..]];
185206

186-
let conditional_on_finalize_balance = accs.user_conditional_on_finalize_token_account.amount;
207+
let conditional_on_finalize_balance =
208+
accs.user_conditional_on_finalize_token_account.amount;
187209
let conditional_on_revert_balance = accs.user_conditional_on_revert_token_account.amount;
188210

189211
// burn everything for good measure
@@ -192,7 +214,9 @@ pub mod conditional_vault {
192214
accs.token_program.to_account_info(),
193215
Burn {
194216
mint: accs.conditional_on_finalize_token_mint.to_account_info(),
195-
from: accs.user_conditional_on_finalize_token_account.to_account_info(),
217+
from: accs
218+
.user_conditional_on_finalize_token_account
219+
.to_account_info(),
196220
authority: accs.authority.to_account_info(),
197221
},
198222
),
@@ -204,7 +228,9 @@ pub mod conditional_vault {
204228
accs.token_program.to_account_info(),
205229
Burn {
206230
mint: accs.conditional_on_revert_token_mint.to_account_info(),
207-
from: accs.user_conditional_on_revert_token_account.to_account_info(),
231+
from: accs
232+
.user_conditional_on_revert_token_account
233+
.to_account_info(),
208234
authority: accs.authority.to_account_info(),
209235
},
210236
),
@@ -239,27 +265,43 @@ pub mod conditional_vault {
239265
)?;
240266
}
241267

242-
ctx.accounts.user_conditional_on_finalize_token_account.reload()?;
243-
ctx.accounts.user_conditional_on_revert_token_account.reload()?;
268+
ctx.accounts
269+
.user_conditional_on_finalize_token_account
270+
.reload()?;
271+
ctx.accounts
272+
.user_conditional_on_revert_token_account
273+
.reload()?;
244274
ctx.accounts.vault_underlying_token_account.reload()?;
245275
ctx.accounts.conditional_on_finalize_token_mint.reload()?;
246276
ctx.accounts.conditional_on_revert_token_mint.reload()?;
247277

248-
let post_user_conditional_on_finalize_balance = ctx.accounts.user_conditional_on_finalize_token_account.amount;
249-
let post_user_conditional_on_revert_balance = ctx.accounts.user_conditional_on_revert_token_account.amount;
278+
let post_user_conditional_on_finalize_balance = ctx
279+
.accounts
280+
.user_conditional_on_finalize_token_account
281+
.amount;
282+
let post_user_conditional_on_revert_balance =
283+
ctx.accounts.user_conditional_on_revert_token_account.amount;
250284
let post_vault_underlying_balance = ctx.accounts.vault_underlying_token_account.amount;
251285
let post_finalize_mint_supply = ctx.accounts.conditional_on_finalize_token_mint.supply;
252286
let post_revert_mint_supply = ctx.accounts.conditional_on_revert_token_mint.supply;
253287

254288
assert!(post_user_conditional_on_finalize_balance == 0);
255289
assert!(post_user_conditional_on_revert_balance == 0);
256-
assert!(post_finalize_mint_supply == pre_finalize_mint_supply - conditional_on_finalize_balance);
290+
assert!(
291+
post_finalize_mint_supply == pre_finalize_mint_supply - conditional_on_finalize_balance
292+
);
257293
assert!(post_revert_mint_supply == pre_revert_mint_supply - conditional_on_revert_balance);
258294
if vault_status == VaultStatus::Finalized {
259-
assert!(post_vault_underlying_balance == pre_vault_underlying_balance - conditional_on_finalize_balance);
295+
assert!(
296+
post_vault_underlying_balance
297+
== pre_vault_underlying_balance - conditional_on_finalize_balance
298+
);
260299
} else {
261300
assert!(vault_status == VaultStatus::Reverted);
262-
assert!(post_vault_underlying_balance == pre_vault_underlying_balance - conditional_on_revert_balance);
301+
assert!(
302+
post_vault_underlying_balance
303+
== pre_vault_underlying_balance - conditional_on_revert_balance
304+
);
263305
}
264306

265307
Ok(())

0 commit comments

Comments
 (0)