From b48aefdfaa99cce220c5535668e7c01983feaf0a Mon Sep 17 00:00:00 2001 From: Jordan Prince Date: Tue, 21 Sep 2021 21:23:29 -0500 Subject: [PATCH] Metadata for fair launch (#460) * added deploy cmds * Too specific * Add metadata support for fair launch tokens. --- js/packages/cli/src/fair-launch-cli.ts | 107 +++++++++++++++-- rust/Cargo.lock | 1 + rust/fair-launch/Cargo.toml | 1 + rust/fair-launch/src/lib.rs | 153 +++++++++++++++++++++++++ rust/test/fair-launch-types.ts | 2 +- 5 files changed, 254 insertions(+), 10 deletions(-) diff --git a/js/packages/cli/src/fair-launch-cli.ts b/js/packages/cli/src/fair-launch-cli.ts index 575e26a..65835a4 100755 --- a/js/packages/cli/src/fair-launch-cli.ts +++ b/js/packages/cli/src/fair-launch-cli.ts @@ -7,6 +7,7 @@ import { Token, MintLayout } from '@solana/spl-token'; import { CACHE_PATH, FAIR_LAUNCH_PROGRAM_ID, + TOKEN_METADATA_PROGRAM_ID, TOKEN_PROGRAM_ID, } from './helpers/constants'; import { @@ -19,6 +20,7 @@ import { getAtaForMint, getFairLaunchTicketSeqLookup, getFairLaunchLotteryBitmap, + getMetadata, } from './helpers/accounts'; import { chunks, getMultipleAccounts, sleep } from './helpers/various'; import { createAssociatedTokenAccountInstruction } from './helpers/instructions'; @@ -825,6 +827,93 @@ async function adjustTicket({ ); } +program + .command('set_token_metadata') + .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') + .option('-n, --name ', 'name') + .option('-s, --symbol ', 'symbol') + .option('-u, --uri ', 'uri') + .option( + '-sfbp, --seller_fee_basis_points ', + 'seller fee basis points', + ) + .option( + '-c, --creators ', + 'comma separated creator wallets like wallet1,73,true,wallet2,27,false where its wallet, then share, then verified true/false', + ) + .option('-nm, --is_not_mutable', 'is not mutable') + .action(async (_, cmd) => { + const { + env, + keypair, + fairLaunch, + name, + symbol, + uri, + sellerFeeBasisPoints, + creators, + isNotMutable, + } = cmd.opts(); + const sellerFeeBasisPointsNumber = parseFloat(sellerFeeBasisPoints); + + const creatorsListPre = creators ? creators.split(',') : []; + const creatorsList = []; + for (let i = 0; i < creatorsListPre.length; i += 3) { + creatorsList.push({ + address: new anchor.web3.PublicKey(creatorsListPre[i]), + share: parseInt(creatorsListPre[i + 1]), + verified: creatorsListPre[i + 2] == 'true' ? true : false, + }); + } + const isMutableBool = isNotMutable ? false : true; + 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, + ); + + await anchorProgram.rpc.setTokenMetadata( + { + name, + symbol, + uri, + sellerFeeBasisPoints: sellerFeeBasisPointsNumber, + creators: creatorsList, + isMutable: isMutableBool, + }, + { + accounts: { + fairLaunch: fairLaunchKey, + authority: walletKeyPair.publicKey, + payer: walletKeyPair.publicKey, + //@ts-ignore + metadata: await getMetadata(fairLaunchObj.tokenMint), + //@ts-ignore + tokenMint: fairLaunchObj.tokenMint, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: anchor.web3.SystemProgram.programId, + rent: anchor.web3.SYSVAR_RENT_PUBKEY, + clock: anchor.web3.SYSVAR_CLOCK_PUBKEY, + }, + }, + ); + + console.log('Set token metadata.'); + }); + program .command('adjust_ticket') .option( @@ -858,9 +947,8 @@ program ) )[0]; - const fairLaunchLotteryBitmap = ( //@ts-ignore - await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint) - )[0]; + const fairLaunchLotteryBitmap = //@ts-ignore + (await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint))[0]; await adjustTicket({ amountNumber, @@ -1189,9 +1277,8 @@ 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, @@ -1314,9 +1401,8 @@ 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: { @@ -1831,6 +1917,9 @@ program systemProgram: anchor.web3.SystemProgram.programId, rent: anchor.web3.SYSVAR_RENT_PUBKEY, }, + options: { + commitment: 'single', + }, signers: [], }); console.log('Created...'); diff --git a/rust/Cargo.lock b/rust/Cargo.lock index bcfca5f..8d8c3d1 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1039,6 +1039,7 @@ dependencies = [ "arrayref", "spl-associated-token-account", "spl-token", + "spl-token-metadata", ] [[package]] diff --git a/rust/fair-launch/Cargo.toml b/rust/fair-launch/Cargo.toml index eee8a80..b4f2c3f 100644 --- a/rust/fair-launch/Cargo.toml +++ b/rust/fair-launch/Cargo.toml @@ -20,3 +20,4 @@ anchor-spl = "0.14.0" arrayref = "0.3.6" spl-associated-token-account = { version="1.0.3", features = [ "no-entrypoint" ] } spl-token = { version="3.1.1", features = [ "no-entrypoint" ] } +spl-token-metadata = { path = "../token-metadata/program", features = [ "no-entrypoint" ] } diff --git a/rust/fair-launch/src/lib.rs b/rust/fair-launch/src/lib.rs index 2b4341f..3635c02 100644 --- a/rust/fair-launch/src/lib.rs +++ b/rust/fair-launch/src/lib.rs @@ -19,6 +19,7 @@ use { }, anchor_spl::token::Mint, spl_token::{instruction::initialize_account2, state::Account}, + spl_token_metadata::instruction::{create_metadata_accounts, update_metadata_accounts}, }; pub const PREFIX: &str = "fair_launch"; @@ -959,6 +960,108 @@ pub mod fair_launch { Ok(()) } + + pub fn set_token_metadata<'info>( + ctx: Context<'_, '_, '_, 'info, SetTokenMetadata<'info>>, + data: TokenMetadata, + ) -> ProgramResult { + let fair_launch = &ctx.accounts.fair_launch; + let token_mint = fair_launch.token_mint; + + let authority_seeds = [PREFIX.as_bytes(), token_mint.as_ref(), &[fair_launch.bump]]; + + let mut creators: Vec = + vec![spl_token_metadata::state::Creator { + address: fair_launch.key(), + verified: true, + share: 0, + }]; + + if let Some(cre) = &data.creators { + for c in cre { + creators.push(spl_token_metadata::state::Creator { + address: c.address, + verified: c.verified, + share: c.share, + }); + } + } + + let update_infos = vec![ + ctx.accounts.token_metadata_program.clone(), + ctx.accounts.token_program.clone(), + ctx.accounts.metadata.clone(), + fair_launch.to_account_info().clone(), + ]; + + if ctx.accounts.metadata.data_is_empty() { + msg!("Creating metadata"); + let metadata_infos = vec![ + ctx.accounts.metadata.clone(), + ctx.accounts.token_mint.clone(), + ctx.accounts.payer.clone(), + ctx.accounts.token_metadata_program.clone(), + ctx.accounts.token_program.clone(), + ctx.accounts.system_program.clone(), + ctx.accounts.rent.to_account_info().clone(), + fair_launch.to_account_info().clone(), + ]; + + invoke_signed( + &create_metadata_accounts( + *ctx.accounts.token_metadata_program.key, + *ctx.accounts.metadata.key, + *ctx.accounts.token_mint.key, + fair_launch.key(), + *ctx.accounts.payer.key, + ctx.accounts.fair_launch.key(), + data.name, + data.symbol.clone(), + data.uri, + Some(creators), + data.seller_fee_basis_points, + false, + data.is_mutable, + ), + metadata_infos.as_slice(), + &[&authority_seeds], + )?; + invoke_signed( + &update_metadata_accounts( + *ctx.accounts.token_metadata_program.key, + *ctx.accounts.metadata.key, + fair_launch.key(), + None, + None, + Some(true), + ), + update_infos.as_slice(), + &[&authority_seeds], + )?; + } else { + msg!("Updating metadata"); + invoke_signed( + &update_metadata_accounts( + *ctx.accounts.token_metadata_program.key, + *ctx.accounts.metadata.key, + fair_launch.key(), + None, + Some(spl_token_metadata::state::Data { + name: data.name, + symbol: data.symbol, + uri: data.uri, + creators: Some(creators), + seller_fee_basis_points: data.seller_fee_basis_points, + }), + None, + ), + update_infos.as_slice(), + &[&authority_seeds], + )?; + } + + Ok(()) + } } #[derive(Accounts)] #[instruction(bump: u8, treasury_bump: u8, token_mint_bump: u8, data: FairLaunchData)] @@ -1167,6 +1270,30 @@ pub struct ReceiveRefund<'info> { // [Writable/optional] buyer payment token account (must be ata) } +#[derive(Accounts)] +pub struct SetTokenMetadata<'info> { + #[account(mut, seeds=[PREFIX.as_bytes(), fair_launch.token_mint.as_ref()], bump=fair_launch.bump, has_one=authority, has_one=token_mint)] + fair_launch: ProgramAccount<'info, FairLaunch>, + #[account(mut, signer)] + authority: AccountInfo<'info>, + #[account(mut, signer)] + payer: AccountInfo<'info>, + // With the following accounts we aren't using anchor macros because they are CPI'd + // through to token-metadata which will do all the validations we need on them. + #[account(mut)] + metadata: AccountInfo<'info>, + #[account(mut)] + token_mint: AccountInfo<'info>, + #[account(address = spl_token_metadata::id())] + token_metadata_program: AccountInfo<'info>, + #[account(address = spl_token::id())] + token_program: AccountInfo<'info>, + #[account(address = system_program::ID)] + system_program: AccountInfo<'info>, + rent: Sysvar<'info, Rent>, + clock: Sysvar<'info, Clock>, +} + pub const FAIR_LAUNCH_LOTTERY_SIZE: usize = 8 + // discriminator 32 + // fair launch 1 + // bump @@ -1222,6 +1349,31 @@ pub const FAIR_LAUNCH_TICKET_SEQ_SIZE: usize = 8 + //discriminator 1 + // bump 50; // padding; +// Note both TokenMetadata/Creator copied over from token metadata due to anchor needing them +// in file to put into IDL +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Default)] +pub struct Creator { + pub address: Pubkey, + pub verified: bool, + // In percentages, NOT basis points ;) Watch out! + pub share: u8, +} + +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Default)] +pub struct TokenMetadata { + /// The name of the asset + pub name: String, + /// The symbol for the asset + pub symbol: String, + /// URI pointing to JSON representing the asset + pub uri: String, + /// Royalty basis points that goes to creators in secondary sales (0-10000) + pub seller_fee_basis_points: u16, + /// Array of creators, optional + pub creators: Option>, + pub is_mutable: bool, +} + #[derive(AnchorSerialize, AnchorDeserialize, Clone, Default)] pub struct AntiRugSetting { /// basis points kept in the treasury until conditions are met @@ -1277,6 +1429,7 @@ pub struct FairLaunch { pub current_eligible_holders: u64, pub current_median: u64, pub counts_at_each_tick: Vec, + // Todo add participation fields in the future for participation NFTs } #[account] diff --git a/rust/test/fair-launch-types.ts b/rust/test/fair-launch-types.ts index 99bdfbf..683116b 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":"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"}]}; +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":[]},{"name":"setTokenMetadata","accounts":[{"name":"fairLaunch","isMut":true,"isSigner":false},{"name":"authority","isMut":true,"isSigner":true},{"name":"payer","isMut":true,"isSigner":true},{"name":"metadata","isMut":true,"isSigner":false},{"name":"tokenMint","isMut":true,"isSigner":false},{"name":"tokenMetadataProgram","isMut":false,"isSigner":false},{"name":"tokenProgram","isMut":false,"isSigner":false},{"name":"systemProgram","isMut":false,"isSigner":false},{"name":"rent","isMut":false,"isSigner":false},{"name":"clock","isMut":false,"isSigner":false}],"args":[{"name":"data","type":{"defined":"TokenMetadata"}}]}],"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":"Creator","type":{"kind":"struct","fields":[{"name":"address","type":"publicKey"},{"name":"verified","type":"bool"},{"name":"share","type":"u8"}]}},{"name":"TokenMetadata","type":{"kind":"struct","fields":[{"name":"name","type":"string"},{"name":"symbol","type":"string"},{"name":"uri","type":"string"},{"name":"sellerFeeBasisPoints","type":"u16"},{"name":"creators","type":{"option":{"vec":{"defined":"Creator"}}}},{"name":"isMutable","type":"bool"}]}},{"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>