diff --git a/js/packages/cli/src/fair-launch-cli.ts b/js/packages/cli/src/fair-launch-cli.ts index 7dcf1ee..69a5bc3 100755 --- a/js/packages/cli/src/fair-launch-cli.ts +++ b/js/packages/cli/src/fair-launch-cli.ts @@ -49,9 +49,21 @@ program '--keypair not provided', ) .option('-u, --uuid ', 'uuid') - .option('-f, --fee ', 'price range end', '2') + .option('-f, --fee ', 'fee', '2') .option('-s, --price-range-start ', 'price range start', '1') .option('-e, --price-range-end ', 'price range end', '2') + .option( + '-arbp, --anti-rug-reserve-bp ', + 'optional anti-rug treasury reserve basis points (1-10000)', + ) + .option( + '-atc, --anti-rug-token-requirement ', + 'optional anti-rug token requirement when reserve opens - 100 means 100 tokens remaining out of total supply', + ) + .option( + '-sd, --self-destruct-date ', + 'optional date when funds from anti-rug setting will be returned - eg "04 Dec 1995 00:12:00 GMT"', + ) .option( '-pos, --phase-one-start-date ', 'timestamp - eg "04 Dec 1995 00:12:00 GMT"', @@ -84,7 +96,31 @@ program fee, mint, uuid, + selfDestructDate, + antiRugTokenRequirement, + antiRugReserveBp, } = cmd.opts(); + const antiRugTokenRequirementNumber = antiRugTokenRequirement + ? parseInt(antiRugTokenRequirement) + : null; + const antiRugReserveBpNumber = antiRugReserveBp + ? parseFloat(antiRugReserveBp) + : null; + const selfDestructDateActual = selfDestructDate + ? Date.parse(selfDestructDate) / 1000 + : null; + + const antiRug = + antiRugTokenRequirementNumber && + antiRugReserveBpNumber && + selfDestructDateActual + ? { + reserveBp: antiRugReserveBpNumber, + tokenRequirement: antiRugTokenRequirementNumber, + selfDestructDate: selfDestructDateActual, + } + : null; + const parsedNumber = parseInt(numberOfTokens); let priceRangeStartNumber = parseFloat(priceRangeStart); let priceRangeEndNumber = parseFloat(priceRangeEnd); @@ -132,7 +168,6 @@ program fairLaunchBump, treasuryBump, tokenBump, - { uuid: realUuid, priceRangeStart: new anchor.BN(priceRangeStartNumber), @@ -143,6 +178,7 @@ program tickSize: new anchor.BN(tickSizeNumber), numberOfTokens: new anchor.BN(parsedNumber), fee: new anchor.BN(feeNumber), + antiRugSetting: antiRug, }, { accounts: { @@ -179,6 +215,18 @@ program .option('-f, --fee ', 'price range end', '2') .option('-s, --price-range-start ', 'price range start', '1') .option('-e, --price-range-end ', 'price range end', '2') + .option( + '-arbp, --anti-rug-reserve-bp ', + 'optional anti-rug treasury reserve basis points (1-10000)', + ) + .option( + '-atc, --anti-rug-token-requirement ', + 'optional anti-rug token requirement when reserve opens - 100 means 100 tokens remaining out of total supply', + ) + .option( + '-sd, --self-destruct-date ', + 'optional date when funds from anti-rug setting will be returned - eg "04 Dec 1995 00:12:00 GMT"', + ) .option( '-pos, --phase-one-start-date ', 'timestamp - eg "04 Dec 1995 00:12:00 GMT"', @@ -211,7 +259,30 @@ program fee, mint, uuid, + selfDestructDate, + antiRugTokenRequirement, + antiRugReserveBp, } = cmd.opts(); + const antiRugTokenRequirementNumber = antiRugTokenRequirement + ? parseInt(antiRugTokenRequirement) + : null; + const antiRugReserveBpNumber = antiRugReserveBp + ? parseFloat(antiRugReserveBp) + : null; + const selfDestructDateActual = selfDestructDate + ? Date.parse(selfDestructDate) / 1000 + : null; + + const antiRug = + antiRugTokenRequirementNumber && + antiRugReserveBpNumber && + selfDestructDateActual + ? { + reserveBp: antiRugReserveBpNumber, + tokenRequirement: antiRugTokenRequirementNumber, + selfDestructDate: selfDestructDateActual, + } + : null; const parsedNumber = parseInt(numberOfTokens); let priceRangeStartNumber = parseFloat(priceRangeStart); let priceRangeEndNumber = parseFloat(priceRangeEnd); @@ -255,6 +326,7 @@ program tickSize: new anchor.BN(tickSizeNumber), numberOfTokens: new anchor.BN(parsedNumber), fee: new anchor.BN(feeNumber), + antiRugSetting: antiRug, }, { accounts: { @@ -434,8 +506,9 @@ program ) )[0]; - const fairLaunchLotteryBitmap = //@ts-ignore - (await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint))[0]; + const fairLaunchLotteryBitmap = ( //@ts-ignore + await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint) + )[0]; const remainingAccounts = []; const instructions = []; @@ -512,6 +585,44 @@ program ); }); +program + .command('start_phase_three') + .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); + + const fairLaunchKey = new anchor.web3.PublicKey(fairLaunch); + const fairLaunchObj = await anchorProgram.account.fairLaunch.fetch( + fairLaunchKey, + ); + const fairLaunchLotteryBitmap = ( //@ts-ignore + await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint) + )[0]; + + await anchorProgram.rpc.startPhaseThree({ + accounts: { + fairLaunch, + fairLaunchLotteryBitmap, + authority: walletKeyPair.publicKey, + }, + }); + + console.log(`Dang son, phase three.`); + }); + program .command('create_fair_launch_lottery') .option( @@ -1056,6 +1167,10 @@ program const fairLaunchLotteryBitmapObj = await anchorProgram.provider.connection.getAccountInfo(fairLaunchLottery); + const fairLaunchLotteryBitmapAnchorObj = + await anchorProgram.account.fairLaunchLotteryBitmap.fetch( + fairLaunchLottery, + ); const seqKeys = []; //@ts-ignore for (let i = 0; i < fairLaunchObj.numberTicketsSold; i++) { @@ -1129,5 +1244,11 @@ program isWinner > 0 ? 'won' : 'lost', ); } + + console.log( + 'Bit Map ones', + //@ts-ignore + fairLaunchLotteryBitmapAnchorObj.bitmapOnes.toNumber(), + ); }); program.parse(process.argv); diff --git a/rust/fair-launch/src/lib.rs b/rust/fair-launch/src/lib.rs index 2b9ccc2..0a38800 100644 --- a/rust/fair-launch/src/lib.rs +++ b/rust/fair-launch/src/lib.rs @@ -154,7 +154,7 @@ 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.number_tickets_sold { + if fair_launch_lottery_bitmap.bitmap_ones != fair_launch.data.number_of_tokens { return Err(ErrorCode::LotteryBitmapOnesMustEqualNumberOfTicketsSold.into()); } @@ -182,8 +182,8 @@ pub mod fair_launch { let mut curr_pos = FAIR_LAUNCH_LOTTERY_SIZE + (index as usize); for byte in bytes { let curr_byte = lottery_data[curr_pos]; - msg!("Curr byte is {}", curr_byte); - for bit_position in 0..7 { + msg!("Curr byte is {}, new byte is {}", curr_byte, byte); + for bit_position in 0..8 { msg!("Looking for position {}", bit_position); let mask = u8::pow(2, bit_position as u32); let curr_byte_masked = curr_byte & mask; @@ -224,9 +224,8 @@ pub mod fair_launch { .checked_add(number_of_ones_changed as u64) .ok_or(ErrorCode::NumericalOverflowError)?; } - - lottery_data[FAIR_LAUNCH_LOTTERY_SIZE - 4..FAIR_LAUNCH_LOTTERY_SIZE] - .copy_from_slice(&(new_number_of_ones as u32).to_le_bytes()); + msg!("new number of ones is {}", new_number_of_ones); + fair_launch_lottery_bitmap.bitmap_ones = new_number_of_ones; Ok(()) } @@ -934,6 +933,10 @@ pub const FAIR_LAUNCH_SPACE_VEC_START: usize = 8 + // discriminator 8 + // tick size 8 + // number of tokens 8 + // fee +1 + // anti rug option +2 + // anti rug bp +8 + // anti rug token count +8 + // self destruct date 8 + // number of tickets unseq'ed 8 + // number of tickets sold 8 + // number of tickets dropped @@ -956,6 +959,17 @@ pub const FAIR_LAUNCH_TICKET_SEQ_SIZE: usize = 8 + //discriminator 8 + //seq 1; // bump +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Default)] +pub struct AntiRugSetting { + /// basis points kept in the treasury until conditions are met + pub reserve_bp: u16, + /// The supply of the fair launch mint must be below this amount + /// to unlock the reserve + pub token_requirement: u64, + /// if you don't meet your promise by this date, pro-rated refunds are allowed + pub self_destruct_date: i64, +} + #[derive(AnchorSerialize, AnchorDeserialize, Clone, Default)] pub struct FairLaunchData { pub uuid: String, @@ -967,6 +981,7 @@ pub struct FairLaunchData { pub tick_size: u64, pub number_of_tokens: u64, pub fee: u64, + pub anti_rug_setting: Option, } #[account] diff --git a/rust/fair-launch/src/utils.rs b/rust/fair-launch/src/utils.rs index 4b1d2b0..95b782e 100644 --- a/rust/fair-launch/src/utils.rs +++ b/rust/fair-launch/src/utils.rs @@ -135,12 +135,13 @@ pub fn adjust_counts( let mut ticks: u64 = 0; let mut last_seen_tick_value_with_positive_counts: u64 = 0; for n in &fair_launch.counts_at_each_tick { + let is_possible_perfect_split = counter == median_location; counter = counter .checked_add(*n) .ok_or(ErrorCode::NumericalOverflowError)?; if counter > median_location { - if let Some(val) = median_location.checked_rem(2) { - if val == 0 { + if let Some(val) = total_counts.checked_rem(2) { + if val == 0 && is_possible_perfect_split { let half_way = ticks .checked_sub(last_seen_tick_value_with_positive_counts) .ok_or(ErrorCode::NumericalOverflowError)?; diff --git a/rust/test/fair-launch-types.ts b/rust/test/fair-launch-types.ts index c0da51f..228e2c0 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":false,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":false,"isSigner":false},{"name":"payer","isMut":true,"isSigner":true},{"name":"buyerTokenAccount","isMut":true,"isSigner":false},{"name":"tokenMint","isMut":false,"isSigner":false},{"name":"tokenProgram","isMut":false,"isSigner":false}],"args":[]},{"name":"withdrawFunds","accounts":[{"name":"fairLaunch","isMut":false,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"authority","isMut":true,"isSigner":false},{"name":"systemProgram","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":"phaseThreeStarted","type":"bool"},{"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":"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":"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"}]}; +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":false,"isSigner":false},{"name":"fairLaunchLotteryBitmap","isMut":false,"isSigner":false},{"name":"payer","isMut":true,"isSigner":true},{"name":"buyerTokenAccount","isMut":true,"isSigner":false},{"name":"tokenMint","isMut":false,"isSigner":false},{"name":"tokenProgram","isMut":false,"isSigner":false}],"args":[]},{"name":"withdrawFunds","accounts":[{"name":"fairLaunch","isMut":false,"isSigner":false},{"name":"treasury","isMut":true,"isSigner":false},{"name":"authority","isMut":true,"isSigner":false},{"name":"systemProgram","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":"phaseThreeStarted","type":"bool"},{"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"}]}; import { IdlAccounts } from '@project-serum/anchor'; export type FairLaunchTicketState = Record>