From d8d9ab677169db51bea35ae8b1734260e833ab29 Mon Sep 17 00:00:00 2001 From: Jordan Prince Date: Thu, 16 Sep 2021 17:49:06 -0500 Subject: [PATCH] wip on fair launch new fields --- js/packages/cli/src/fair-launch-cli.ts | 23 +++++++-- js/packages/fair-launch/src/Home.tsx | 60 ++++++++++++++++++++++ js/packages/fair-launch/src/fair-launch.ts | 22 ++++---- rust/fair-launch/src/lib.rs | 4 +- rust/fair-launch/src/utils.rs | 59 ++++++++++++++------- rust/test/fair-launch-types.ts | 2 +- 6 files changed, 138 insertions(+), 32 deletions(-) diff --git a/js/packages/cli/src/fair-launch-cli.ts b/js/packages/cli/src/fair-launch-cli.ts index 6b3ba85..591b0b1 100755 --- a/js/packages/cli/src/fair-launch-cli.ts +++ b/js/packages/cli/src/fair-launch-cli.ts @@ -1617,16 +1617,27 @@ program const statesFlat = states.flat(); - //@ts-ignore; - let numWinnersRemaining = fairLaunchObj.data.numberOfTokens; + let numWinnersRemaining = Math.min( + //@ts-ignore; + fairLaunchObj.data.numberOfTokens, + //@ts-ignore; + statesFlat.filter(s => s.eligible).length, + ); + + console.log( + 'Dunn', + //@ts-ignore; + fairLaunchObj.numberTicketsSold - fairLaunchObj.numberTicketsDropped, + ); let chosen: { seq: anchor.BN; eligible: boolean; chosen: boolean }[]; if (numWinnersRemaining >= statesFlat.length) { console.log('More or equal nfts than winners, everybody wins.'); chosen = statesFlat.map(s => ({ ...s, chosen: true })); } else { - console.log('Doing lottery.'); chosen = statesFlat.map(s => ({ ...s, chosen: false })); + + console.log('Doing lottery for', numWinnersRemaining); while (numWinnersRemaining > 0) { const rand = Math.round(Math.random() * (chosen.length - 1)); if (chosen[rand].chosen != true && chosen[rand].eligible) { @@ -1960,6 +1971,12 @@ program fairLaunchObj.phaseThreeStarted, ); + console.log( + 'Current Eligible Holders', + //@ts-ignore + fairLaunchObj.currentEligibleHolders.toNumber(), + ); + console.log( 'Current Median', //@ts-ignore diff --git a/js/packages/fair-launch/src/Home.tsx b/js/packages/fair-launch/src/Home.tsx index 1466320..9ba2955 100644 --- a/js/packages/fair-launch/src/Home.tsx +++ b/js/packages/fair-launch/src/Home.tsx @@ -41,7 +41,9 @@ import { import { FairLaunchAccount, FairLaunchTicket, + getFairLaunchLotteryBitmap, getFairLaunchState, + punchTicket, purchaseTicket, withdrawFunds, } from './fair-launch'; @@ -129,6 +131,30 @@ export interface HomeProps { txTimeout: number; } +const FAIR_LAUNCH_LOTTERY_SIZE = + 8 + // discriminator + 32 + // fair launch + 1 + // bump + 8; // size of bitmask ones + +const isWinner = ( + phaseThree: boolean | undefined, + lottery: Uint8Array | null, + sequence: anchor.BN | undefined, +): boolean => { + if (!lottery || !lottery.length || !sequence || !phaseThree) { + return false; + } + + const myByte = + lottery[FAIR_LAUNCH_LOTTERY_SIZE + Math.floor(sequence.toNumber() / 8)]; + + const positionFromRight = 7 - (sequence.toNumber() % 8); + const mask = Math.pow(2, positionFromRight); + const isWinner = myByte & mask; + return isWinner > 0; +}; + const Home = (props: HomeProps) => { const [balance, setBalance] = useState(); const [isActive, setIsActive] = useState(false); // true when countdown completes @@ -138,6 +164,7 @@ const Home = (props: HomeProps) => { const [selectedTab, setSelectedTab] = useState(0); const [ticket, setTicket] = useState(null); const [treasury, setTreasury] = useState(null); + const [lottery, setLottery] = useState(null); const wallet = useWallet(); @@ -282,6 +309,19 @@ const Home = (props: HomeProps) => { state.state.treasury, ); setTreasury(treasury); + const fairLaunchLotteryBitmap = ( + await getFairLaunchLotteryBitmap( + //@ts-ignore + fairLaunchObj.tokenMint, + ) + )[0]; + + const fairLaunchLotteryBitmapObj = + await state.program.provider.connection.getAccountInfo( + fairLaunchLotteryBitmap, + ); + + setLottery(new Uint8Array(fairLaunchLotteryBitmapObj?.data || [])); console.log(); } catch { @@ -339,6 +379,16 @@ const Home = (props: HomeProps) => { purchaseTicket(contributed, anchorWallet, fairLaunch, ticket); }; + const onPunchTicket = () => { + if (!anchorWallet || !fairLaunch) { + return; + } + + console.log('punch'); + + punchTicket(anchorWallet, fairLaunch); + }; + const onWithdraw = () => { if (!anchorWallet) { return; @@ -410,6 +460,16 @@ const Home = (props: HomeProps) => { {!ticket ? 'Place a bid' : 'Adjust your bid'} + {isWinner( + fairLaunch?.state.phaseThreeStarted, + lottery, + ticket?.seq, + ) && ( + + Punch Ticket + + )} + How raffles works diff --git a/js/packages/fair-launch/src/fair-launch.ts b/js/packages/fair-launch/src/fair-launch.ts index b2f9663..1031662 100644 --- a/js/packages/fair-launch/src/fair-launch.ts +++ b/js/packages/fair-launch/src/fair-launch.ts @@ -2,7 +2,10 @@ import * as anchor from '@project-serum/anchor'; import { TOKEN_PROGRAM_ID, Token } from '@solana/spl-token'; import { LAMPORTS_PER_SOL } from '@solana/web3.js'; -import { getAtaForMint } from './utils'; +import { + createAssociatedTokenAccountInstruction, + getAtaForMint, +} from './utils'; export const FAIR_LAUNCH_PROGRAM = new anchor.web3.PublicKey( '7HmfyvWK7LDohUL9TDAuGv9VFZHUce1SgYMkwti1xWwF', @@ -49,6 +52,7 @@ export interface FairLaunchState { bump: number; currentMedian: anchor.BN; + currentEligibleHolders: anchor.BN; data: { antiRugSetting?: AntiRugSetting; fee: anchor.BN; @@ -121,8 +125,8 @@ export const getFairLaunchState = async ( }, }; }; -/* -const punchTicket = async ( + +export const punchTicket = async ( anchorWallet: anchor.Wallet, fairLaunch: FairLaunchAccount, ) => { @@ -134,9 +138,8 @@ const punchTicket = async ( ) )[0]; - const fairLaunchLotteryBitmap = ( //@ts-ignore - await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint) - )[0]; + const fairLaunchLotteryBitmap = //@ts-ignore + (await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint))[0]; const buyerTokenAccount = ( await getAtaForMint( @@ -167,7 +170,7 @@ const punchTicket = async ( ), ], }); -};*/ +}; export const getFairLaunchTicket = async ( tokenMint: anchor.web3.PublicKey, @@ -276,8 +279,9 @@ export const purchaseTicket = async ( ); if (ticket) { - const fairLaunchLotteryBitmap = //@ts-ignore - (await getFairLaunchLotteryBitmap(fairLaunch.state.tokenMint))[0]; + const fairLaunchLotteryBitmap = ( //@ts-ignore + await getFairLaunchLotteryBitmap(fairLaunch.state.tokenMint) + )[0]; console.log( 'Anchor wallet', anchorWallet.publicKey.toBase58(), diff --git a/rust/fair-launch/src/lib.rs b/rust/fair-launch/src/lib.rs index 85cb61e..1f4c914 100644 --- a/rust/fair-launch/src/lib.rs +++ b/rust/fair-launch/src/lib.rs @@ -157,7 +157,7 @@ pub mod fair_launch { if fair_launch_lottery_bitmap.bitmap_ones != std::cmp::min( fair_launch.data.number_of_tokens, - fair_launch.number_tickets_sold, + fair_launch.current_eligible_holders, ) { return Err(ErrorCode::LotteryBitmapOnesMustEqualNumberOfTicketsSold.into()); @@ -1195,6 +1195,7 @@ pub const FAIR_LAUNCH_SPACE_VEC_START: usize = 8 + // discriminator 8 + // number of tokens preminted 1 + // phase three started 9 + // treasury snapshot +8 + // current_eligible_holders 8 + // current median, 4 + // u32 representing number of amounts in vec so far 100; // padding @@ -1267,6 +1268,7 @@ pub struct FairLaunch { pub phase_three_started: bool, /// Snapshot of treasury taken on first withdrawal. pub treasury_snapshot: Option, + pub current_eligible_holders: u64, pub current_median: u64, pub counts_at_each_tick: Vec, } diff --git a/rust/fair-launch/src/utils.rs b/rust/fair-launch/src/utils.rs index 77013ea..cca54d3 100644 --- a/rust/fair-launch/src/utils.rs +++ b/rust/fair-launch/src/utils.rs @@ -121,15 +121,28 @@ pub fn adjust_counts( } let mut total_counts: u64 = 0; + let mut ticks: u64 = 0; + let mut first_val_seen = false; + let mut first_val = 0; for n in &fair_launch.counts_at_each_tick { total_counts = total_counts .checked_add(*n) .ok_or(ErrorCode::NumericalOverflowError)?; + if !first_val_seen && n > &0 { + first_val = ticks + .checked_add(fair_launch.data.price_range_start) + .ok_or(ErrorCode::NumericalOverflowError)?; + first_val_seen = true; + } + ticks = ticks + .checked_add(fair_launch.data.tick_size) + .ok_or(ErrorCode::NumericalOverflowError)?; } if total_counts == 1 { // degen case - fair_launch.current_median = new_amount; + fair_launch.current_median = first_val; + fair_launch.current_eligible_holders = 1; return Ok(()); } @@ -140,39 +153,49 @@ pub fn adjust_counts( let mut counter: u64 = 0; let mut ticks: u64 = 0; let mut last_seen_tick_value_with_positive_counts: u64 = 0; + let mut current_eligible_holders: u64 = 0; + let mut done: bool = false; 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) = 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)?; - ticks = half_way - .checked_div(2) - .ok_or(ErrorCode::NumericalOverflowError)?; - ticks = last_seen_tick_value_with_positive_counts - .checked_add(ticks) - .ok_or(ErrorCode::NumericalOverflowError)?; + if !done { + 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)?; + ticks = half_way + .checked_div(2) + .ok_or(ErrorCode::NumericalOverflowError)?; + ticks = last_seen_tick_value_with_positive_counts + .checked_add(ticks) + .ok_or(ErrorCode::NumericalOverflowError)?; + } } + done = true; } - break; + current_eligible_holders += n; } - if n > &0 { - last_seen_tick_value_with_positive_counts = ticks; + if !done { + if n > &0 { + last_seen_tick_value_with_positive_counts = ticks; + } + ticks = ticks + .checked_add(fair_launch.data.tick_size) + .ok_or(ErrorCode::NumericalOverflowError)?; } - ticks = ticks - .checked_add(fair_launch.data.tick_size) - .ok_or(ErrorCode::NumericalOverflowError)?; } fair_launch.current_median = ticks .checked_add(fair_launch.data.price_range_start) .ok_or(ErrorCode::NumericalOverflowError)?; + fair_launch.current_eligible_holders = current_eligible_holders; + Ok(()) } diff --git a/rust/test/fair-launch-types.ts b/rust/test/fair-launch-types.ts index 1362245..99bdfbf 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":"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"},{"code":353,"name":"FairLaunchMismatch","msg":"Fair launch ticket and fair launch key mismatch"}]}; +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":"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":"currentEligibleHolders","type":"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"},{"code":353,"name":"FairLaunchMismatch","msg":"Fair launch ticket and fair launch key mismatch"}]}; import { IdlAccounts } from '@project-serum/anchor'; export type FairLaunchTicketState = Record>