From 52fec3c4cac1b0582801a14ed65955d94375d385 Mon Sep 17 00:00:00 2001 From: Jordan Prince Date: Tue, 14 Sep 2021 14:32:29 -0500 Subject: [PATCH] Some more fixes --- js/packages/cli/src/fair-launch-cli.ts | 182 ++++++++++++++++++++++--- rust/fair-launch/src/lib.rs | 54 +++++++- rust/fair-launch/src/utils.rs | 4 + rust/test/fair-launch-types.ts | 2 +- 4 files changed, 224 insertions(+), 18 deletions(-) diff --git a/js/packages/cli/src/fair-launch-cli.ts b/js/packages/cli/src/fair-launch-cli.ts index 3ef7636..354b1b6 100755 --- a/js/packages/cli/src/fair-launch-cli.ts +++ b/js/packages/cli/src/fair-launch-cli.ts @@ -78,6 +78,7 @@ program '-pte, --phase-two-end-date ', 'timestamp - eg "04 Dec 1995 00:12:00 GMT"', ) + .option('-ld, --lottery-duration ', 'seconds eg 86400') .option('-ts, --tick-size ', 'tick size', '0.1') .option('-n, --number-of-tokens ', 'Number of tokens to sell') .option( @@ -101,6 +102,7 @@ program selfDestructDate, antiRugTokenRequirement, antiRugReserveBp, + lotteryDuration, } = cmd.opts(); const antiRugTokenRequirementNumber = antiRugTokenRequirement @@ -140,7 +142,10 @@ program (phaseTwoEndDate ? Date.parse(phaseTwoEndDate) : Date.now() + 2 * 86400000) / 1000; + const lotteryDurationActual = lotteryDuration ? lotteryDuration : 86400; + const walletKeyPair = loadWalletKey(keypair); + const anchorProgram = await loadFairLaunchProgram(walletKeyPair, env); if (!mint) { priceRangeStartNumber = Math.ceil( priceRangeStartNumber * LAMPORTS_PER_SOL, @@ -148,10 +153,24 @@ program priceRangeEndNumber = Math.ceil(priceRangeEndNumber * LAMPORTS_PER_SOL); tickSizeNumber = Math.ceil(tickSizeNumber * LAMPORTS_PER_SOL); feeNumber = Math.ceil(feeNumber * LAMPORTS_PER_SOL); + } else { + const token = new Token( + anchorProgram.provider.connection, + //@ts-ignore + fairLaunchObj.treasuryMint, + TOKEN_PROGRAM_ID, + walletKeyPair, + ); + + const mintInfo = await token.getMintInfo(); + + const mantissa = 10 ** mintInfo.decimals; + priceRangeStartNumber = Math.ceil(priceRangeStartNumber * mantissa); + priceRangeEndNumber = Math.ceil(priceRangeEndNumber * mantissa); + tickSizeNumber = Math.ceil(tickSizeNumber * mantissa); + feeNumber = Math.ceil(feeNumber * mantissa); } - const walletKeyPair = loadWalletKey(keypair); - const anchorProgram = await loadFairLaunchProgram(walletKeyPair, env); const [tokenMint, tokenBump] = await getTokenMint( walletKeyPair.publicKey, realUuid, @@ -179,6 +198,7 @@ program phaseOneStart: new anchor.BN(phaseOneStartDateActual), phaseOneEnd: new anchor.BN(phaseOneEndDateActual), phaseTwoEnd: new anchor.BN(phaseTwoEndDateActual), + lotteryDuration: new anchor.BN(lotteryDurationActual), tickSize: new anchor.BN(tickSizeNumber), numberOfTokens: new anchor.BN(parsedNumber), fee: new anchor.BN(feeNumber), @@ -239,6 +259,7 @@ program '-poe, --phase-one-end-date ', 'timestamp - eg "04 Dec 1995 00:12:00 GMT"', ) + .option('-ld, --lottery-duration ', 'seconds eg 86400') .option( '-pte, --phase-two-end-date ', 'timestamp - eg "04 Dec 1995 00:12:00 GMT"', @@ -266,6 +287,7 @@ program selfDestructDate, antiRugTokenRequirement, antiRugReserveBp, + lotteryDuration, } = cmd.opts(); const antiRugTokenRequirementNumber = antiRugTokenRequirement ? parseInt(antiRugTokenRequirement) @@ -302,7 +324,10 @@ program (phaseTwoEndDate ? Date.parse(phaseTwoEndDate) : Date.now() + 2 * 86400000) / 1000; + const lotteryDurationActual = lotteryDuration ? lotteryDuration : 86400; + const walletKeyPair = loadWalletKey(keypair); + const anchorProgram = await loadFairLaunchProgram(walletKeyPair, env); if (!mint) { priceRangeStartNumber = Math.ceil( priceRangeStartNumber * LAMPORTS_PER_SOL, @@ -310,10 +335,24 @@ program priceRangeEndNumber = Math.ceil(priceRangeEndNumber * LAMPORTS_PER_SOL); tickSizeNumber = Math.ceil(tickSizeNumber * LAMPORTS_PER_SOL); feeNumber = Math.ceil(feeNumber * LAMPORTS_PER_SOL); + } else { + const token = new Token( + anchorProgram.provider.connection, + //@ts-ignore + fairLaunchObj.treasuryMint, + TOKEN_PROGRAM_ID, + walletKeyPair, + ); + + const mintInfo = await token.getMintInfo(); + + const mantissa = 10 ** mintInfo.decimals; + priceRangeStartNumber = Math.ceil(priceRangeStartNumber * mantissa); + priceRangeEndNumber = Math.ceil(priceRangeEndNumber * mantissa); + tickSizeNumber = Math.ceil(tickSizeNumber * mantissa); + feeNumber = Math.ceil(feeNumber * mantissa); } - const walletKeyPair = loadWalletKey(keypair); - const anchorProgram = await loadFairLaunchProgram(walletKeyPair, env); const tokenMint = ( await getTokenMint(walletKeyPair.publicKey, realUuid) )[0]; @@ -327,6 +366,7 @@ program phaseOneStart: new anchor.BN(phaseOneStartDateActual), phaseOneEnd: new anchor.BN(phaseOneEndDateActual), phaseTwoEnd: new anchor.BN(phaseTwoEndDateActual), + lotteryDuration: new anchor.BN(lotteryDurationActual), tickSize: new anchor.BN(tickSizeNumber), numberOfTokens: new anchor.BN(parsedNumber), fee: new anchor.BN(feeNumber), @@ -385,7 +425,15 @@ program } else { const transferAuthority = anchor.web3.Keypair.generate(); signers.push(transferAuthority); + const token = new Token( + anchorProgram.provider.connection, + //@ts-ignore + fairLaunchObj.treasuryMint, + TOKEN_PROGRAM_ID, + walletKeyPair, + ); + const mintInfo = await token.getMintInfo(); instructions.push( Token.createApproveInstruction( TOKEN_PROGRAM_ID, @@ -394,8 +442,10 @@ program transferAuthority.publicKey, walletKeyPair.publicKey, [], - //@ts-ignore - amountNumber + fairLaunchObj.data.fees.toNumber(), + + amountNumber * 10 ** mintInfo.decimals + + //@ts-ignore + fairLaunchObj.data.fees.toNumber(), ), ); @@ -476,7 +526,46 @@ program console.log('Created seq'); }); +/* +program + .command('create_dummy_payment_mint') + .option( + '-e, --env ', + 'Solana cluster env name', + 'devnet', //mainnet-beta, testnet, devnet + ) + .option( + '-k, --keypair ', + `Solana wallet location`, + '--keypair not provided', + ) + .action(async (_, cmd) => { + const { env, keypair, fairLaunch, amount } = cmd.opts(); + let amountNumber = parseFloat(amount); + const walletKeyPair = loadWalletKey(keypair); + const anchorProgram = await loadFairLaunchProgram(walletKeyPair, env); + + const fairLaunchKey = new anchor.web3.PublicKey(fairLaunch); + const fairLaunchObj = await anchorProgram.account.fairLaunch.fetch( + fairLaunchKey, + ); + const [fairLaunchTicket, bump] = await getFairLaunchTicket( + //@ts-ignore + fairLaunchObj.tokenMint, + walletKeyPair.publicKey, + ); + + const remainingAccounts = []; + const instructions = []; + const signers = []; + + console.log( + `create fair launch ticket Done: ${fairLaunchTicket.toBase58()}. Trying to create seq now...we may or may not get a validator with data on chain. Either way, your ticket is secure.`, + ); + + console.log('Created seq'); + });*/ async function adjustTicket({ amountNumber, fairLaunchObj, @@ -485,9 +574,11 @@ async function adjustTicket({ fairLaunchTicket, fairLaunchLotteryBitmap, anchorProgram, + payer, }: { amountNumber: number; fairLaunchObj: any; + payer: anchor.web3.Keypair; adjuster: anchor.web3.PublicKey; fairLaunch: anchor.web3.PublicKey; fairLaunchTicket: anchor.web3.PublicKey; @@ -504,7 +595,14 @@ async function adjustTicket({ } else { const transferAuthority = anchor.web3.Keypair.generate(); signers.push(transferAuthority); + const token = new Token( + anchorProgram.provider.connection, + fairLaunchObj.treasuryMint, + TOKEN_PROGRAM_ID, + payer, + ); + const mintInfo = await token.getMintInfo(); if (amountNumber > 0) { instructions.push( Token.createApproveInstruction( @@ -515,7 +613,8 @@ async function adjustTicket({ adjuster, [], //@ts-ignore - amountNumber + fairLaunchObj.data.fees.toNumber(), + amountNumber * 10 ** mintInfo.decimals + + fairLaunchObj.data.fees.toNumber(), ), ); } @@ -604,8 +703,9 @@ program ) )[0]; - const fairLaunchLotteryBitmap = //@ts-ignore - (await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint))[0]; + const fairLaunchLotteryBitmap = ( //@ts-ignore + await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint) + )[0]; await adjustTicket({ amountNumber, @@ -615,6 +715,7 @@ program fairLaunchTicket, fairLaunchLotteryBitmap, anchorProgram, + payer: walletKeyPair, }); }); @@ -760,6 +861,7 @@ program fairLaunchTicket: ticket.key, fairLaunchLotteryBitmap, anchorProgram, + payer: walletKeyPair, }); } else { const myByte = @@ -795,6 +897,7 @@ program fairLaunchTicket: ticket.key, fairLaunchLotteryBitmap, anchorProgram, + payer: walletKeyPair, }); } const buyerTokenAccount = await punchTicket({ @@ -825,6 +928,7 @@ program fairLaunchTicket: ticket.key, fairLaunchLotteryBitmap, anchorProgram, + payer: walletKeyPair, }); console.log('Refunded.'); } @@ -930,8 +1034,9 @@ program ) )[0]; - const fairLaunchLotteryBitmap = //@ts-ignore - (await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint))[0]; + const fairLaunchLotteryBitmap = ( //@ts-ignore + await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint) + )[0]; const ticket = await anchorProgram.account.fairLaunchTicket.fetch( fairLaunchTicket, @@ -954,6 +1059,7 @@ program fairLaunchTicket, fairLaunchLotteryBitmap, anchorProgram, + payer: walletKeyPair, }); } const buyerTokenAccount = await punchTicket({ @@ -1053,14 +1159,16 @@ program const fairLaunchObj = await anchorProgram.account.fairLaunch.fetch( fairLaunchKey, ); - const fairLaunchLotteryBitmap = //@ts-ignore - (await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint))[0]; + const fairLaunchLotteryBitmap = ( //@ts-ignore + await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint) + )[0]; await anchorProgram.rpc.startPhaseThree({ accounts: { fairLaunch, fairLaunchLotteryBitmap, authority: walletKeyPair.publicKey, + clock: anchor.web3.SYSVAR_CLOCK_PUBKEY, }, }); @@ -1135,6 +1243,35 @@ program console.log(`Now you rich, give me some.`); }); +program + .command('restart_phase_2') + .option( + '-e, --env ', + 'Solana cluster env name', + 'devnet', //mainnet-beta, testnet, devnet + ) + .option( + '-k, --keypair ', + `Solana wallet location`, + '--keypair not provided', + ) + .option('-f, --fair-launch ', 'fair launch id') + .action(async (_, cmd) => { + const { env, keypair, fairLaunch } = cmd.opts(); + + const walletKeyPair = loadWalletKey(keypair); + const anchorProgram = await loadFairLaunchProgram(walletKeyPair, env); + + await anchorProgram.rpc.restartPhaseTwo({ + accounts: { + fairLaunch, + clock: anchor.web3.SYSVAR_CLOCK_PUBKEY, + }, + }); + + console.log(`Clock restart on phase 2`); + }); + program .command('receive_refund') .option( @@ -1452,6 +1589,7 @@ program fairLaunch, fairLaunchLotteryBitmap, authority: walletKeyPair.publicKey, + clock: anchor.web3.SYSVAR_CLOCK_PUBKEY, }, }, ); @@ -1638,21 +1776,33 @@ program ); console.log( - 'Phase One Start', + 'Phase One Start ', //@ts-ignore new Date(fairLaunchObj.data.phaseOneStart.toNumber() * 1000), ); console.log( - 'Phase One End ', + 'Phase One End ', //@ts-ignore new Date(fairLaunchObj.data.phaseOneEnd.toNumber() * 1000), ); console.log( - 'Phase Two End ', + 'Phase Two End ', //@ts-ignore new Date(fairLaunchObj.data.phaseTwoEnd.toNumber() * 1000), ); + console.log( + 'Lottery Period End', + //@ts-ignore + new Date( + //@ts-ignore + (fairLaunchObj.data.phaseTwoEnd.toNumber() + + //@ts-ignore + fairLaunchObj.data.lotteryDuration.toNumber()) * + 1000, + ), + ); + console.log( 'Number of Tokens', //@ts-ignore diff --git a/rust/fair-launch/src/lib.rs b/rust/fair-launch/src/lib.rs index f3ea0d0..9447345 100644 --- a/rust/fair-launch/src/lib.rs +++ b/rust/fair-launch/src/lib.rs @@ -155,7 +155,12 @@ pub mod fair_launch { let fair_launch = &mut ctx.accounts.fair_launch; let fair_launch_lottery_bitmap = &ctx.accounts.fair_launch_lottery_bitmap; - if fair_launch_lottery_bitmap.bitmap_ones != fair_launch.data.number_of_tokens { + if fair_launch_lottery_bitmap.bitmap_ones + != std::cmp::min( + fair_launch.data.number_of_tokens, + fair_launch.number_tickets_sold, + ) + { return Err(ErrorCode::LotteryBitmapOnesMustEqualNumberOfTicketsSold.into()); } @@ -894,6 +899,35 @@ pub mod fair_launch { Ok(()) } + + pub fn restart_phase_two<'info>( + ctx: Context<'_, '_, '_, 'info, RestartPhaseTwo<'info>>, + ) -> ProgramResult { + let fair_launch = &mut ctx.accounts.fair_launch; + let clock = &mut ctx.accounts.clock; + + if fair_launch.phase_three_started { + return Err(ErrorCode::PhaseThreeAlreadyStarted.into()); + } + + if clock.unix_timestamp < fair_launch.data.phase_two_end { + return Err(ErrorCode::PhaseTwoHasntEndedYet.into()); + } + + if clock.unix_timestamp + < fair_launch + .data + .phase_two_end + .checked_add(fair_launch.data.lottery_duration) + .ok_or(ErrorCode::NumericalOverflowError)? + { + return Err(ErrorCode::LotteryDurationHasntEndedYet.into()); + } + + fair_launch.data.phase_two_end = clock.unix_timestamp + fair_launch.data.lottery_duration; + + Ok(()) + } } #[derive(Accounts)] #[instruction(bump: u8, treasury_bump: u8, token_mint_bump: u8, data: FairLaunchData)] @@ -938,6 +972,14 @@ pub struct StartPhaseThree<'info> { authority: AccountInfo<'info>, } +/// Restarts phase two with as much time as the lottery duration had if duration is passed +#[derive(Accounts)] +pub struct RestartPhaseTwo<'info> { + #[account(mut, seeds=[PREFIX.as_bytes(), fair_launch.token_mint.as_ref()], bump=fair_launch.bump)] + fair_launch: ProgramAccount<'info, FairLaunch>, + clock: Sysvar<'info, Clock>, +} + /// Can only create the fair launch lottery bitmap after phase 1 has ended. #[derive(Accounts)] #[instruction(bump: u8)] @@ -1112,6 +1154,7 @@ pub const FAIR_LAUNCH_SPACE_VEC_START: usize = 8 + // discriminator 8 + // phase one start 8 + // phase one end 8 + // phase two end +8 + // lottery duration 8 + // tick size 8 + // number of tokens 8 + // fee @@ -1166,6 +1209,7 @@ pub struct FairLaunchData { pub phase_one_start: i64, pub phase_one_end: i64, pub phase_two_end: i64, + pub lottery_duration: i64, pub tick_size: u64, pub number_of_tokens: u64, pub fee: u64, @@ -1336,4 +1380,12 @@ pub enum ErrorCode { CannotPunchTicketUntilPhaseThree, #[msg("Cannot punch ticket until you have refunded the difference between your given price and the median.")] CannotPunchTicketUntilEqualized, + #[msg("Invalid lottery duration")] + InvalidLotteryDuration, + #[msg("Phase two already started")] + PhaseThreeAlreadyStarted, + #[msg("Phase two hasnt ended yet")] + PhaseTwoHasntEndedYet, + #[msg("Lottery duration hasnt ended yet")] + LotteryDurationHasntEndedYet, } diff --git a/rust/fair-launch/src/utils.rs b/rust/fair-launch/src/utils.rs index f0abad8..fa0278c 100644 --- a/rust/fair-launch/src/utils.rs +++ b/rust/fair-launch/src/utils.rs @@ -207,6 +207,10 @@ pub fn assert_data_valid(data: &FairLaunchData) -> ProgramResult { return Err(ErrorCode::InvalidPriceRanges.into()); } + if data.lottery_duration < 0 { + return Err(ErrorCode::InvalidLotteryDuration.into()); + } + if let Some(anti_rug) = &data.anti_rug_setting { if anti_rug.reserve_bp > 10000 { return Err(ErrorCode::InvalidReserveBp.into()); diff --git a/rust/test/fair-launch-types.ts b/rust/test/fair-launch-types.ts index 8d57ebc..56d7115 100644 --- a/rust/test/fair-launch-types.ts +++ b/rust/test/fair-launch-types.ts @@ -1,4 +1,4 @@ -export type FairLaunchIDL = {"version":"0.0.0","name":"fair_launch","instructions":[{"name":"initializeFairLaunch","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"tokenMint","isMut":true,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":false},{"name":"payer","isMut":true,"isSigner":true},{"name":"tokenProgram","isMut":false,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false}],"args":[{"name":"bump","type":"u8"},{"name":"treasuryBump","type":"u8"},{"name":"tokenMintBump","type":"u8"},{"name":"data","type":{"defined":"FairLaunchData"}}]},{"name":"updateFairLaunch","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true},{"name":"clock","isMut":false,"isSigner":false}],"args":[{"name":"data","type":{"defined":"FairLaunchData"}}]},{"name":"startPhaseThree","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":false,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true}],"args":[]},{"name":"updateFairLaunchLotteryBitmap","accounts":[{"name":"fairLaunch","isMut":false,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true}],"args":[{"name":"index","type":"u32"},{"name":"bytes","type":"bytes"}]},{"name":"createFairLaunchLotteryBitmap","accounts":[{"name":"fairLaunch","isMut":false,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true},{"name":"payer","isMut":true,"isSigner":true},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[{"name":"bump","type":"u8"}]},{"name":"purchaseTicket","accounts":[{"name":"fairLaunchTicket","isMut":true,"isSigner":false},{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"buyer","isMut":true,"isSigner":true},{"name":"payer","isMut":true,"isSigner":true},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[{"name":"bump","type":"u8"},{"name":"amount","type":"u64"}]},{"name":"createTicketSeq","accounts":[{"name":"fairLaunchTicketSeqLookup","isMut":true,"isSigner":false},{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"fairLaunchTicket","isMut":true,"isSigner":false},{"name":"payer","isMut":true,"isSigner":true},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false}],"args":[{"name":"bump","type":"u8"}]},{"name":"adjustTicket","accounts":[{"name":"fairLaunchTicket","isMut":true,"isSigner":false},{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":false,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"buyer","isMut":true,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[{"name":"amount","type":"u64"}]},{"name":"punchTicket","accounts":[{"name":"fairLaunchTicket","isMut":true,"isSigner":false},{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":false,"isSigner":false},{"name":"payer","isMut":true,"isSigner":true},{"name":"buyerTokenAccount","isMut":true,"isSigner":false},{"name":"tokenMint","isMut":true,"isSigner":false},{"name":"tokenProgram","isMut":false,"isSigner":false}],"args":[]},{"name":"withdrawFunds","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"authority","isMut":true,"isSigner":true},{"name":"tokenMint","isMut":true,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false}],"args":[]},{"name":"receiveRefund","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"buyer","isMut":true,"isSigner":false},{"name":"buyerTokenAccount","isMut":true,"isSigner":false},{"name":"transferAuthority","isMut":false,"isSigner":true},{"name":"tokenMint","isMut":true,"isSigner":false},{"name":"tokenProgram","isMut":false,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[]}],"accounts":[{"name":"fairLaunch","type":{"kind":"struct","fields":[{"name":"tokenMint","type":"publicKey"},{"name":"treasury","type":"publicKey"},{"name":"treasuryMint","type":{"option":"publicKey"}},{"name":"authority","type":"publicKey"},{"name":"bump","type":"u8"},{"name":"treasuryBump","type":"u8"},{"name":"tokenMintBump","type":"u8"},{"name":"data","type":{"defined":"FairLaunchData"}},{"name":"numberTicketsUnSeqed","type":"u64"},{"name":"numberTicketsSold","type":"u64"},{"name":"numberTicketsDropped","type":"u64"},{"name":"numberTicketsPunched","type":"u64"},{"name":"numberTokensBurnedForRefunds","type":"u64"},{"name":"numberTokensPreminted","type":"u64"},{"name":"phaseThreeStarted","type":"bool"},{"name":"treasurySnapshot","type":{"option":"u64"}},{"name":"currentMedian","type":"u64"},{"name":"countsAtEachTick","type":{"vec":"u64"}}]}},{"name":"fairLaunchLotteryBitmap","type":{"kind":"struct","fields":[{"name":"fairLaunch","type":"publicKey"},{"name":"bump","type":"u8"},{"name":"bitmapOnes","type":"u64"}]}},{"name":"fairLaunchTicket","type":{"kind":"struct","fields":[{"name":"fairLaunch","type":"publicKey"},{"name":"buyer","type":"publicKey"},{"name":"amount","type":"u64"},{"name":"state","type":{"defined":"FairLaunchTicketState"}},{"name":"bump","type":"u8"},{"name":"seq","type":"u64"}]}},{"name":"fairLaunchTicketSeqLookup","type":{"kind":"struct","fields":[{"name":"fairLaunchTicket","type":"publicKey"},{"name":"buyer","type":"publicKey"},{"name":"seq","type":"u64"},{"name":"bump","type":"u8"}]}}],"types":[{"name":"AntiRugSetting","type":{"kind":"struct","fields":[{"name":"reserveBp","type":"u16"},{"name":"tokenRequirement","type":"u64"},{"name":"selfDestructDate","type":"i64"}]}},{"name":"FairLaunchData","type":{"kind":"struct","fields":[{"name":"uuid","type":"string"},{"name":"priceRangeStart","type":"u64"},{"name":"priceRangeEnd","type":"u64"},{"name":"phaseOneStart","type":"i64"},{"name":"phaseOneEnd","type":"i64"},{"name":"phaseTwoEnd","type":"i64"},{"name":"tickSize","type":"u64"},{"name":"numberOfTokens","type":"u64"},{"name":"fee","type":"u64"},{"name":"antiRugSetting","type":{"option":{"defined":"AntiRugSetting"}}}]}},{"name":"FairLaunchTicketState","type":{"kind":"enum","variants":[{"name":"NoSequenceStruct"},{"name":"Unpunched"},{"name":"Punched"},{"name":"Withdrawn"}]}}],"errors":[{"code":300,"name":"IncorrectOwner","msg":"Account does not have correct owner!"},{"code":301,"name":"Uninitialized","msg":"Account is not initialized!"},{"code":302,"name":"MintMismatch","msg":"Mint Mismatch!"},{"code":303,"name":"TokenTransferFailed","msg":"Token transfer failed"},{"code":304,"name":"NumericalOverflowError","msg":"Numerical overflow error"},{"code":305,"name":"TimestampsDontLineUp","msg":"Timestamps of phases should line up"},{"code":306,"name":"CantSetPhaseThreeDatesYet","msg":"Cant set phase 3 dates yet"},{"code":307,"name":"UuidMustBeExactly6Length","msg":"Uuid must be exactly of 6 length"},{"code":308,"name":"TickSizeTooSmall","msg":"Tick size too small"},{"code":309,"name":"CannotGiveZeroTokens","msg":"Cannot give zero tokens"},{"code":310,"name":"InvalidPriceRanges","msg":"Invalid price ranges"},{"code":311,"name":"TooMuchGranularityInRange","msg":"With this tick size and price range, you will have too many ticks(>"},{"code":312,"name":"CannotUseTickSizeThatGivesRemainder","msg":"Cannot use a tick size with a price range that results in a remainder when doing (end-start)/ticksize"},{"code":313,"name":"DerivedKeyInvalid","msg":"Derived key invalid"},{"code":314,"name":"TreasuryAlreadyExists","msg":"Treasury Already Exists"},{"code":315,"name":"LotteryBitmapOnesMustEqualNumberOfTicketsSold","msg":"The number of ones in the lottery must equal the number of tickets sold in phase 1"},{"code":316,"name":"InvalidPurchaseAmount","msg":"Amount must be between price ranges and at a tick mark"},{"code":317,"name":"TreasuryMintMismatch","msg":"Treasury mint does not match"},{"code":318,"name":"NotEnoughTokens","msg":"Not enough tokens to pay for this minting"},{"code":319,"name":"NotEnoughSOL","msg":"Not enough SOL to pay for this minting"},{"code":320,"name":"InvalidTokenProgram","msg":"Sent up invalid token program"},{"code":321,"name":"CannotBuyTicketsOutsidePhaseOne","msg":"Cannot buy tickets outside phase one"},{"code":322,"name":"CannotCreateFairLaunchLotteryBitmapBeforePhaseTwoEnd","msg":"Cannot create the bitmap before phase two end"},{"code":323,"name":"CannotUpdateFairLaunchLotteryOncePhaseThreeLocked","msg":"Cannot update fair launch lottery once phase three locked"},{"code":324,"name":"SeqAlreadyExists","msg":"Seq already exists"},{"code":325,"name":"CannotSetFairLaunchLotteryUntilAllTicketsAreSequenced","msg":"Cannot set lottery until all tickets have sequence lookups using permissionless crank endpoint. Use CLI to make."},{"code":326,"name":"CanOnlySubmitZeroDuringPhaseThree","msg":"During phase three, since you did not pay up to the median, you can only withdraw your funds"},{"code":327,"name":"CanOnlySubmitDifferenceDuringPhaseThree","msg":"During phase three, since you paid above median, you can only withdraw the difference"},{"code":328,"name":"DidNotWinLotteryCanOnlyWithdraw","msg":"You did not win the lottery, therefore you can only withdraw your funds"},{"code":329,"name":"AccountShouldHaveNoDelegates","msg":"This account should have no delegates"},{"code":330,"name":"TokenMintToFailed","msg":"Token minting failed"},{"code":331,"name":"DuringPhaseTwoAndOneBuyerMustBeSigner","msg":"During phase two and one buyer must be signer"},{"code":332,"name":"InvalidFairLaunchTicketState","msg":"Invalid fair launch ticket state for this operation"},{"code":333,"name":"CannotCashOutUntilAllRefundsAndPunchesHaveBeenProcessed","msg":"Cannot cash out until all refunds and punches (permissionless calls) have been processed. Use the CLI."},{"code":334,"name":"CannotCashOutUntilPhaseThree","msg":"Cannot cash out until phase three"},{"code":335,"name":"CannotUpdateFairLaunchDataOnceInProgress","msg":"Cannot update fair launch variables once it is in progress"},{"code":336,"name":"PhaseTwoEnded","msg":"Not able to adjust tickets between phase two and three"},{"code":337,"name":"CannotPunchTicketWhenHavingPaidLessThanMedian","msg":"Cannot punch ticket when having paid less than median."},{"code":338,"name":"AlreadyWithdrawnCapitalAlotment","msg":"You have already withdrawn your seed capital alotment from the treasury."},{"code":339,"name":"NoAntiRugSetting","msg":"No anti rug settings on this fair launch. Should've checked twice."},{"code":340,"name":"SelfDestructNotPassed","msg":"Self destruct date has not passed yet, so you are not eligible for a refund."},{"code":341,"name":"TokenBurnFailed","msg":"Token burn failed"},{"code":342,"name":"NoTreasurySnapshot","msg":"No treasury snapshot present"},{"code":343,"name":"CannotRefundUntilAllTicketsHaveBeenPunchedOrDropped","msg":"Cannot refund until all existing tickets have been dropped or punched"},{"code":344,"name":"CannotRefundUntilPhaseThree","msg":"Cannot refund until phase three"},{"code":345,"name":"InvalidReserveBp","msg":"Invalid reserve bp"},{"code":346,"name":"InvalidAntiRugTokenRequirement","msg":"Anti Rug Token Requirement must be less than or equal to number of tokens being sold"},{"code":347,"name":"CannotPunchTicketUntilPhaseThree","msg":"Cannot punch ticket until phase three"},{"code":348,"name":"CannotPunchTicketUntilEqualized","msg":"Cannot punch ticket until you have refunded the difference between your given price and the median."}]}; +export type FairLaunchIDL = {"version":"0.0.0","name":"fair_launch","instructions":[{"name":"initializeFairLaunch","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"tokenMint","isMut":true,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":false},{"name":"payer","isMut":true,"isSigner":true},{"name":"tokenProgram","isMut":false,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false}],"args":[{"name":"bump","type":"u8"},{"name":"treasuryBump","type":"u8"},{"name":"tokenMintBump","type":"u8"},{"name":"data","type":{"defined":"FairLaunchData"}}]},{"name":"updateFairLaunch","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true},{"name":"clock","isMut":false,"isSigner":false}],"args":[{"name":"data","type":{"defined":"FairLaunchData"}}]},{"name":"startPhaseThree","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":false,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true}],"args":[]},{"name":"updateFairLaunchLotteryBitmap","accounts":[{"name":"fairLaunch","isMut":false,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true}],"args":[{"name":"index","type":"u32"},{"name":"bytes","type":"bytes"}]},{"name":"createFairLaunchLotteryBitmap","accounts":[{"name":"fairLaunch","isMut":false,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":true,"isSigner":false},{"name":"authority","isMut":false,"isSigner":true},{"name":"payer","isMut":true,"isSigner":true},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[{"name":"bump","type":"u8"}]},{"name":"purchaseTicket","accounts":[{"name":"fairLaunchTicket","isMut":true,"isSigner":false},{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"buyer","isMut":true,"isSigner":true},{"name":"payer","isMut":true,"isSigner":true},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[{"name":"bump","type":"u8"},{"name":"amount","type":"u64"}]},{"name":"createTicketSeq","accounts":[{"name":"fairLaunchTicketSeqLookup","isMut":true,"isSigner":false},{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"fairLaunchTicket","isMut":true,"isSigner":false},{"name":"payer","isMut":true,"isSigner":true},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false}],"args":[{"name":"bump","type":"u8"}]},{"name":"adjustTicket","accounts":[{"name":"fairLaunchTicket","isMut":true,"isSigner":false},{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":false,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"buyer","isMut":true,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[{"name":"amount","type":"u64"}]},{"name":"punchTicket","accounts":[{"name":"fairLaunchTicket","isMut":true,"isSigner":false},{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":false,"isSigner":false},{"name":"payer","isMut":true,"isSigner":true},{"name":"buyerTokenAccount","isMut":true,"isSigner":false},{"name":"tokenMint","isMut":true,"isSigner":false},{"name":"tokenProgram","isMut":false,"isSigner":false}],"args":[]},{"name":"withdrawFunds","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"authority","isMut":true,"isSigner":true},{"name":"tokenMint","isMut":true,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false}],"args":[]},{"name":"receiveRefund","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"buyer","isMut":true,"isSigner":false},{"name":"buyerTokenAccount","isMut":true,"isSigner":false},{"name":"transferAuthority","isMut":false,"isSigner":true},{"name":"tokenMint","isMut":true,"isSigner":false},{"name":"tokenProgram","isMut":false,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[]},{"name":"restartPhaseTwo","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[]}],"accounts":[{"name":"fairLaunch","type":{"kind":"struct","fields":[{"name":"tokenMint","type":"publicKey"},{"name":"treasury","type":"publicKey"},{"name":"treasuryMint","type":{"option":"publicKey"}},{"name":"authority","type":"publicKey"},{"name":"bump","type":"u8"},{"name":"treasuryBump","type":"u8"},{"name":"tokenMintBump","type":"u8"},{"name":"data","type":{"defined":"FairLaunchData"}},{"name":"numberTicketsUnSeqed","type":"u64"},{"name":"numberTicketsSold","type":"u64"},{"name":"numberTicketsDropped","type":"u64"},{"name":"numberTicketsPunched","type":"u64"},{"name":"numberTokensBurnedForRefunds","type":"u64"},{"name":"numberTokensPreminted","type":"u64"},{"name":"phaseThreeStarted","type":"bool"},{"name":"treasurySnapshot","type":{"option":"u64"}},{"name":"currentMedian","type":"u64"},{"name":"countsAtEachTick","type":{"vec":"u64"}}]}},{"name":"fairLaunchLotteryBitmap","type":{"kind":"struct","fields":[{"name":"fairLaunch","type":"publicKey"},{"name":"bump","type":"u8"},{"name":"bitmapOnes","type":"u64"}]}},{"name":"fairLaunchTicket","type":{"kind":"struct","fields":[{"name":"fairLaunch","type":"publicKey"},{"name":"buyer","type":"publicKey"},{"name":"amount","type":"u64"},{"name":"state","type":{"defined":"FairLaunchTicketState"}},{"name":"bump","type":"u8"},{"name":"seq","type":"u64"}]}},{"name":"fairLaunchTicketSeqLookup","type":{"kind":"struct","fields":[{"name":"fairLaunchTicket","type":"publicKey"},{"name":"buyer","type":"publicKey"},{"name":"seq","type":"u64"},{"name":"bump","type":"u8"}]}}],"types":[{"name":"AntiRugSetting","type":{"kind":"struct","fields":[{"name":"reserveBp","type":"u16"},{"name":"tokenRequirement","type":"u64"},{"name":"selfDestructDate","type":"i64"}]}},{"name":"FairLaunchData","type":{"kind":"struct","fields":[{"name":"uuid","type":"string"},{"name":"priceRangeStart","type":"u64"},{"name":"priceRangeEnd","type":"u64"},{"name":"phaseOneStart","type":"i64"},{"name":"phaseOneEnd","type":"i64"},{"name":"phaseTwoEnd","type":"i64"},{"name":"lotteryDuration","type":"i64"},{"name":"tickSize","type":"u64"},{"name":"numberOfTokens","type":"u64"},{"name":"fee","type":"u64"},{"name":"antiRugSetting","type":{"option":{"defined":"AntiRugSetting"}}}]}},{"name":"FairLaunchTicketState","type":{"kind":"enum","variants":[{"name":"NoSequenceStruct"},{"name":"Unpunched"},{"name":"Punched"},{"name":"Withdrawn"}]}}],"errors":[{"code":300,"name":"IncorrectOwner","msg":"Account does not have correct owner!"},{"code":301,"name":"Uninitialized","msg":"Account is not initialized!"},{"code":302,"name":"MintMismatch","msg":"Mint Mismatch!"},{"code":303,"name":"TokenTransferFailed","msg":"Token transfer failed"},{"code":304,"name":"NumericalOverflowError","msg":"Numerical overflow error"},{"code":305,"name":"TimestampsDontLineUp","msg":"Timestamps of phases should line up"},{"code":306,"name":"CantSetPhaseThreeDatesYet","msg":"Cant set phase 3 dates yet"},{"code":307,"name":"UuidMustBeExactly6Length","msg":"Uuid must be exactly of 6 length"},{"code":308,"name":"TickSizeTooSmall","msg":"Tick size too small"},{"code":309,"name":"CannotGiveZeroTokens","msg":"Cannot give zero tokens"},{"code":310,"name":"InvalidPriceRanges","msg":"Invalid price ranges"},{"code":311,"name":"TooMuchGranularityInRange","msg":"With this tick size and price range, you will have too many ticks(>"},{"code":312,"name":"CannotUseTickSizeThatGivesRemainder","msg":"Cannot use a tick size with a price range that results in a remainder when doing (end-start)/ticksize"},{"code":313,"name":"DerivedKeyInvalid","msg":"Derived key invalid"},{"code":314,"name":"TreasuryAlreadyExists","msg":"Treasury Already Exists"},{"code":315,"name":"LotteryBitmapOnesMustEqualNumberOfTicketsSold","msg":"The number of ones in the lottery must equal the number of tickets sold in phase 1"},{"code":316,"name":"InvalidPurchaseAmount","msg":"Amount must be between price ranges and at a tick mark"},{"code":317,"name":"TreasuryMintMismatch","msg":"Treasury mint does not match"},{"code":318,"name":"NotEnoughTokens","msg":"Not enough tokens to pay for this minting"},{"code":319,"name":"NotEnoughSOL","msg":"Not enough SOL to pay for this minting"},{"code":320,"name":"InvalidTokenProgram","msg":"Sent up invalid token program"},{"code":321,"name":"CannotBuyTicketsOutsidePhaseOne","msg":"Cannot buy tickets outside phase one"},{"code":322,"name":"CannotCreateFairLaunchLotteryBitmapBeforePhaseTwoEnd","msg":"Cannot create the bitmap before phase two end"},{"code":323,"name":"CannotUpdateFairLaunchLotteryOncePhaseThreeLocked","msg":"Cannot update fair launch lottery once phase three locked"},{"code":324,"name":"SeqAlreadyExists","msg":"Seq already exists"},{"code":325,"name":"CannotSetFairLaunchLotteryUntilAllTicketsAreSequenced","msg":"Cannot set lottery until all tickets have sequence lookups using permissionless crank endpoint. Use CLI to make."},{"code":326,"name":"CanOnlySubmitZeroDuringPhaseThree","msg":"During phase three, since you did not pay up to the median, you can only withdraw your funds"},{"code":327,"name":"CanOnlySubmitDifferenceDuringPhaseThree","msg":"During phase three, since you paid above median, you can only withdraw the difference"},{"code":328,"name":"DidNotWinLotteryCanOnlyWithdraw","msg":"You did not win the lottery, therefore you can only withdraw your funds"},{"code":329,"name":"AccountShouldHaveNoDelegates","msg":"This account should have no delegates"},{"code":330,"name":"TokenMintToFailed","msg":"Token minting failed"},{"code":331,"name":"DuringPhaseTwoAndOneBuyerMustBeSigner","msg":"During phase two and one buyer must be signer"},{"code":332,"name":"InvalidFairLaunchTicketState","msg":"Invalid fair launch ticket state for this operation"},{"code":333,"name":"CannotCashOutUntilAllRefundsAndPunchesHaveBeenProcessed","msg":"Cannot cash out until all refunds and punches (permissionless calls) have been processed. Use the CLI."},{"code":334,"name":"CannotCashOutUntilPhaseThree","msg":"Cannot cash out until phase three"},{"code":335,"name":"CannotUpdateFairLaunchDataOnceInProgress","msg":"Cannot update fair launch variables once it is in progress"},{"code":336,"name":"PhaseTwoEnded","msg":"Not able to adjust tickets between phase two and three"},{"code":337,"name":"CannotPunchTicketWhenHavingPaidLessThanMedian","msg":"Cannot punch ticket when having paid less than median."},{"code":338,"name":"AlreadyWithdrawnCapitalAlotment","msg":"You have already withdrawn your seed capital alotment from the treasury."},{"code":339,"name":"NoAntiRugSetting","msg":"No anti rug settings on this fair launch. Should've checked twice."},{"code":340,"name":"SelfDestructNotPassed","msg":"Self destruct date has not passed yet, so you are not eligible for a refund."},{"code":341,"name":"TokenBurnFailed","msg":"Token burn failed"},{"code":342,"name":"NoTreasurySnapshot","msg":"No treasury snapshot present"},{"code":343,"name":"CannotRefundUntilAllTicketsHaveBeenPunchedOrDropped","msg":"Cannot refund until all existing tickets have been dropped or punched"},{"code":344,"name":"CannotRefundUntilPhaseThree","msg":"Cannot refund until phase three"},{"code":345,"name":"InvalidReserveBp","msg":"Invalid reserve bp"},{"code":346,"name":"InvalidAntiRugTokenRequirement","msg":"Anti Rug Token Requirement must be less than or equal to number of tokens being sold"},{"code":347,"name":"CannotPunchTicketUntilPhaseThree","msg":"Cannot punch ticket until phase three"},{"code":348,"name":"CannotPunchTicketUntilEqualized","msg":"Cannot punch ticket until you have refunded the difference between your given price and the median."},{"code":349,"name":"InvalidLotteryDuration","msg":"Invalid lottery duration"},{"code":350,"name":"PhaseThreeAlreadyStarted","msg":"Phase two already started"},{"code":351,"name":"PhaseTwoHasntEndedYet","msg":"Phase two hasnt ended yet"},{"code":352,"name":"LotteryDurationHasntEndedYet","msg":"Lottery duration hasnt ended yet"}]}; import { IdlAccounts } from '@project-serum/anchor'; export type FairLaunchTicketState = Record>