|
@@ -9,7 +9,7 @@ use anchor_spl::token::{self, Burn, Mint, MintTo, TokenAccount, Transfer};
|
|
|
pub mod ido_pool {
|
|
|
use super::*;
|
|
|
|
|
|
- #[access_control(InitializePool::accounts(&ctx, nonce))]
|
|
|
+ #[access_control(InitializePool::accounts(&ctx, nonce) future_start_time(&ctx, start_ido_ts))]
|
|
|
pub fn initialize_pool(
|
|
|
ctx: Context<InitializePool>,
|
|
|
num_ido_tokens: u64,
|
|
@@ -18,8 +18,8 @@ pub mod ido_pool {
|
|
|
end_deposits_ts: i64,
|
|
|
end_ido_ts: i64,
|
|
|
) -> Result<()> {
|
|
|
- if !(start_ido_ts < end_deposits_ts && end_deposits_ts <= end_ido_ts) {
|
|
|
- return Err(ErrorCode::InitTime.into());
|
|
|
+ if !(start_ido_ts < end_deposits_ts && end_deposits_ts < end_ido_ts) {
|
|
|
+ return Err(ErrorCode::SeqTimes.into());
|
|
|
}
|
|
|
|
|
|
let pool_account = &mut ctx.accounts.pool_account;
|
|
@@ -133,6 +133,7 @@ pub mod ido_pool {
|
|
|
return Err(ErrorCode::LowRedeemable.into());
|
|
|
}
|
|
|
|
|
|
+ // Calculate watermelon tokens due.
|
|
|
let watermelon_amount = (amount as u128)
|
|
|
.checked_mul(ctx.accounts.pool_watermelon.amount as u128)
|
|
|
.unwrap()
|
|
@@ -211,6 +212,7 @@ pub struct InitializePool<'info> {
|
|
|
#[account("token_program.key == &token::ID")]
|
|
|
pub token_program: AccountInfo<'info>,
|
|
|
pub rent: Sysvar<'info, Rent>,
|
|
|
+ pub clock: Sysvar<'info, Clock>,
|
|
|
}
|
|
|
|
|
|
impl<'info> InitializePool<'info> {
|
|
@@ -332,8 +334,10 @@ pub struct PoolAccount {
|
|
|
|
|
|
#[error]
|
|
|
pub enum ErrorCode {
|
|
|
+ #[msg("IDO must start in the future")]
|
|
|
+ IdoFuture,
|
|
|
#[msg("IDO times are non-sequential")]
|
|
|
- InitTime,
|
|
|
+ SeqTimes,
|
|
|
#[msg("IDO has not started")]
|
|
|
StartIdoTime,
|
|
|
#[msg("Deposits period has ended")]
|
|
@@ -354,6 +358,14 @@ pub enum ErrorCode {
|
|
|
|
|
|
// Access control modifiers.
|
|
|
|
|
|
+// Asserts the IDO starts in the future.
|
|
|
+fn future_start_time<'info>(ctx: &Context<InitializePool<'info>>, start_ido_ts: i64) -> Result<()> {
|
|
|
+ if !(ctx.accounts.clock.unix_timestamp < start_ido_ts) {
|
|
|
+ return Err(ErrorCode::IdoFuture.into());
|
|
|
+ }
|
|
|
+ Ok(())
|
|
|
+}
|
|
|
+
|
|
|
// Asserts the IDO is in the first phase.
|
|
|
fn unrestricted_phase<'info>(ctx: &Context<ExchangeUsdcForRedeemable<'info>>) -> Result<()> {
|
|
|
if !(ctx.accounts.pool_account.start_ido_ts < ctx.accounts.clock.unix_timestamp) {
|