-
Notifications
You must be signed in to change notification settings - Fork 81
Expand file tree
/
Copy pathlib.rs
More file actions
180 lines (145 loc) · 5.72 KB
/
lib.rs
File metadata and controls
180 lines (145 loc) · 5.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
use anchor_lang::prelude::*;
use anchor_spl::associated_token::AssociatedToken;
use anchor_spl::token::{self, Mint, Token, TokenAccount, Transfer};
use conditional_vault::program::ConditionalVault as ConditionalVaultProgram;
use conditional_vault::{ConditionalVault, Question};
pub mod error;
pub mod events;
pub mod instructions;
pub mod state;
pub use error::FutarchyError;
pub use events::*;
pub use instructions::*;
pub use state::*;
#[cfg(not(feature = "no-entrypoint"))]
use solana_security_txt::security_txt;
#[cfg(not(feature = "no-entrypoint"))]
security_txt! {
name: "futarchy",
project_url: "https://metadao.fi",
contacts: "telegram:metaproph3t,telegram:kollan_house",
source_code: "https://github.com/metaDAOproject/programs",
source_release: "v0.6.1",
policy: "The market will decide whether we pay a bug bounty.",
acknowledgements: "DCF = (CF1 / (1 + r)^1) + (CF2 / (1 + r)^2) + ... (CFn / (1 + r)^n)"
}
declare_id!("FUTARELBfJfQ8RDGhg1wdhddq1odMAJUePHFuBYfUxKq");
pub const SLOTS_PER_10_SECS: u64 = 25;
pub const ONE_MINUTE_IN_SLOTS: u64 = 6 * SLOTS_PER_10_SECS;
pub const MIN_QUOTE_LIQUIDITY: u64 = 100_000;
pub const TEN_DAYS_IN_SECONDS: i64 = 10 * 24 * 60 * 60;
pub const PRICE_SCALE: u128 = 1_000_000_000_000;
// by default, the pass price needs to be 3% higher than the fail price
pub const DEFAULT_PASS_THRESHOLD_BPS: u16 = 300;
// MetaDAO takes 0.5%, LP takes 0%
pub const LP_TAKER_FEE_BPS: u16 = 0;
pub const PROTOCOL_TAKER_FEE_BPS: u16 = 50;
pub const MAX_BPS: u16 = 10_000;
// the index of the fail and pass outcomes in the question and the index of
// the pass and fail conditional tokens in the conditional vault
pub const FAIL_INDEX: usize = 0;
pub const PASS_INDEX: usize = 1;
// TWAP can only move by $5 per slot
pub const DEFAULT_MAX_OBSERVATION_CHANGE_PER_UPDATE_LOTS: u64 = 5_000;
// Unstaking from a proposal should only be allowed after a small delay
pub const MIN_PROPOSAL_UNSTAKE_DELAY_SECONDS: i64 = 5;
#[program]
pub mod futarchy {
use super::*;
#[access_control(ctx.accounts.validate())]
pub fn initialize_dao(ctx: Context<InitializeDao>, params: InitializeDaoParams) -> Result<()> {
InitializeDao::handle(ctx, params)
}
#[access_control(ctx.accounts.validate())]
pub fn initialize_proposal(ctx: Context<InitializeProposal>) -> Result<()> {
InitializeProposal::handle(ctx)
}
#[access_control(ctx.accounts.validate(¶ms))]
pub fn stake_to_proposal(
ctx: Context<StakeToProposal>,
params: StakeToProposalParams,
) -> Result<()> {
StakeToProposal::handle(ctx, params)
}
#[access_control(ctx.accounts.validate(¶ms))]
pub fn unstake_from_proposal(
ctx: Context<UnstakeFromProposal>,
params: UnstakeFromProposalParams,
) -> Result<()> {
UnstakeFromProposal::handle(ctx, params)
}
#[access_control(ctx.accounts.validate())]
pub fn launch_proposal(ctx: Context<LaunchProposal>) -> Result<()> {
LaunchProposal::handle(ctx)
}
#[access_control(ctx.accounts.validate())]
pub fn finalize_proposal(ctx: Context<FinalizeProposal>) -> Result<()> {
FinalizeProposal::handle(ctx)
}
#[access_control(ctx.accounts.validate())]
pub fn update_dao(ctx: Context<UpdateDao>, dao_params: UpdateDaoParams) -> Result<()> {
UpdateDao::handle(ctx, dao_params)
}
// AMM instructions
pub fn spot_swap(ctx: Context<SpotSwap>, params: SpotSwapParams) -> Result<()> {
SpotSwap::handle(ctx, params)
}
#[access_control(ctx.accounts.validate(¶ms))]
pub fn conditional_swap(
ctx: Context<ConditionalSwap>,
params: ConditionalSwapParams,
) -> Result<()> {
ConditionalSwap::handle(ctx, params)
}
pub fn provide_liquidity(
ctx: Context<ProvideLiquidity>,
params: ProvideLiquidityParams,
) -> Result<()> {
ProvideLiquidity::handle(ctx, params)
}
pub fn withdraw_liquidity(
ctx: Context<WithdrawLiquidity>,
params: WithdrawLiquidityParams,
) -> Result<()> {
WithdrawLiquidity::handle(ctx, params)
}
#[access_control(ctx.accounts.validate())]
pub fn collect_fees(ctx: Context<CollectFees>) -> Result<()> {
CollectFees::handle(ctx)
}
#[access_control(ctx.accounts.validate())]
pub fn execute_spending_limit_change<'c: 'info, 'info>(
ctx: Context<'_, '_, 'c, 'info, ExecuteSpendingLimitChange<'info>>,
) -> Result<()> {
ExecuteSpendingLimitChange::handle(ctx)
}
#[access_control(ctx.accounts.validate())]
pub fn sponsor_proposal(ctx: Context<SponsorProposal>) -> Result<()> {
SponsorProposal::handle(ctx)
}
#[access_control(ctx.accounts.validate())]
pub fn collect_meteora_damm_fees(ctx: Context<CollectMeteoraDammFees>) -> Result<()> {
CollectMeteoraDammFees::handle(ctx)
}
#[access_control(ctx.accounts.validate(&args))]
pub fn admin_approve_multisig_proposal(
ctx: Context<AdminApproveMultisigProposal>,
args: AdminApproveMultisigProposalArgs,
) -> Result<()> {
AdminApproveMultisigProposal::handle(ctx, args)
}
#[access_control(ctx.accounts.validate())]
pub fn admin_execute_multisig_proposal<'c: 'info, 'info>(
ctx: Context<'_, '_, 'c, 'info, AdminExecuteMultisigProposal<'info>>,
) -> Result<()> {
AdminExecuteMultisigProposal::handle(ctx)
}
#[access_control(ctx.accounts.validate())]
pub fn admin_cancel_proposal(ctx: Context<AdminCancelProposal>) -> Result<()> {
AdminCancelProposal::handle(ctx)
}
#[access_control(ctx.accounts.validate())]
pub fn admin_remove_proposal(ctx: Context<AdminRemoveProposal>) -> Result<()> {
AdminRemoveProposal::handle(ctx)
}
}