From 9dd06d4d19f1366910a06ed73a42ffd2bf07a3f1 Mon Sep 17 00:00:00 2001 From: Jordan Prince Date: Sat, 11 Sep 2021 15:16:54 -0500 Subject: [PATCH] Adjust ticket --- js/packages/cli/src/fair-launch-cli.ts | 138 +++++++++++++++++++++++- js/packages/cli/src/helpers/accounts.ts | 9 ++ rust/fair-launch/src/lib.rs | 21 ++-- 3 files changed, 157 insertions(+), 11 deletions(-) diff --git a/js/packages/cli/src/fair-launch-cli.ts b/js/packages/cli/src/fair-launch-cli.ts index d4d7595..16c9f04 100755 --- a/js/packages/cli/src/fair-launch-cli.ts +++ b/js/packages/cli/src/fair-launch-cli.ts @@ -18,6 +18,7 @@ import { getFairLaunchTicket, getAtaForMint, getFairLaunchTicketSeqLookup, + getFairLaunchLotteryBitmap, } from './helpers/accounts'; import { sleep } from './helpers/various'; program.version('0.0.1'); @@ -285,6 +286,117 @@ program console.log('Created seq'); }); + +program + .command('adjust_ticket') + .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('-a, --amount ', 'amount') + .action(async (_, cmd) => { + const { env, keypair, fairLaunch, amount } = cmd.opts(); + let amountNumber = parseFloat(amount); + + const walletKeyPair = loadWalletKey(keypair); + const anchorProgram = await loadFairLaunchProgram(walletKeyPair, env); + + const fairLaunchKey = new anchor.web3.PublicKey(fairLaunch); + const fairLaunchObj = await anchorProgram.account.fairLaunch.fetch( + fairLaunchKey, + ); + const fairLaunchTicket = ( + await getFairLaunchTicket( + //@ts-ignore + fairLaunchObj.tokenMint, + walletKeyPair.publicKey, + ) + )[0]; + + const fairLaunchLotteryBitmap = //@ts-ignore + (await getFairLaunchLotteryBitmap(fairLaunchObj.tokenMint))[0]; + + const remainingAccounts = []; + const instructions = []; + const signers = []; + + //@ts-ignore + if (!fairLaunchObj.treasuryMint) { + amountNumber = Math.ceil(amountNumber * LAMPORTS_PER_SOL); + } else { + const transferAuthority = anchor.web3.Keypair.generate(); + signers.push(transferAuthority); + + instructions.push( + Token.createApproveInstruction( + TOKEN_PROGRAM_ID, + //@ts-ignore + fairLaunchObj.treasuryMint, + transferAuthority.publicKey, + walletKeyPair.publicKey, + [], + //@ts-ignore + amountNumber + fairLaunchObj.data.fees.toNumber(), + ), + ); + + remainingAccounts.push({ + //@ts-ignore + pubkey: fairLaunchObj.treasuryMint, + isWritable: true, + isSigner: false, + }); + remainingAccounts.push({ + pubkey: ( + await getAtaForMint( + //@ts-ignore + fairLaunchObj.treasuryMint, + walletKeyPair.publicKey, + ) + )[0], + isWritable: true, + isSigner: false, + }); + remainingAccounts.push({ + pubkey: transferAuthority.publicKey, + isWritable: false, + isSigner: true, + }); + remainingAccounts.push({ + pubkey: TOKEN_PROGRAM_ID, + isWritable: false, + isSigner: false, + }); + } + + await anchorProgram.rpc.adjustTicket(new anchor.BN(amountNumber), { + accounts: { + fairLaunchTicket, + fairLaunch, + fairLaunchLotteryBitmap, + //@ts-ignore + treasury: fairLaunchObj.treasury, + buyer: walletKeyPair.publicKey, + systemProgram: anchor.web3.SystemProgram.programId, + }, + //__private: { logAccounts: true }, + remainingAccounts, + signers, + instructions: instructions.length > 0 ? instructions : undefined, + }); + + console.log( + `update fair launch ticket Done: ${fairLaunchTicket.toBase58()}.`, + ); + }); + program .command('create_missing_sequences') .option( @@ -380,6 +492,22 @@ program fairLaunch, ); + let treasuryAmount = 0; + // @ts-ignore + if (fairLaunchObj.treasuryMint) { + const token = + await anchorProgram.provider.connection.getTokenAccountBalance( + // @ts-ignore + fairLaunchObj.treasury, + ); + treasuryAmount = token.value.uiAmount; + } else { + treasuryAmount = await anchorProgram.provider.connection.getBalance( + // @ts-ignore + fairLaunchObj.treasury, + ); + } + //@ts-ignore console.log('Token Mint', fairLaunchObj.tokenMint.toBase58()); //@ts-ignore @@ -395,28 +523,30 @@ program //@ts-ignore console.log('Token Mint Bump', fairLaunchObj.tokenMintBump); console.log( - 'Price Range Start', + 'Price Range Start ', //@ts-ignore fairLaunchObj.data.priceRangeStart.toNumber(), ); console.log( - 'Price Range Start', + 'Price Range End ', //@ts-ignore fairLaunchObj.data.priceRangeEnd.toNumber(), ); console.log( - 'Tick Size ', + 'Tick Size ', //@ts-ignore fairLaunchObj.data.tickSize.toNumber(), ); console.log( - 'Fees ', + 'Fees ', //@ts-ignore fairLaunchObj.data.fee.toNumber(), ); + console.log('Current Treasury Holdings', treasuryAmount); + console.log( 'Phase One Start', //@ts-ignore diff --git a/js/packages/cli/src/helpers/accounts.ts b/js/packages/cli/src/helpers/accounts.ts index b4946f6..ad43d3a 100644 --- a/js/packages/cli/src/helpers/accounts.ts +++ b/js/packages/cli/src/helpers/accounts.ts @@ -128,6 +128,15 @@ export const getFairLaunchTicket = async ( ); }; +export const getFairLaunchLotteryBitmap = async ( + tokenMint: anchor.web3.PublicKey, +): Promise<[anchor.web3.PublicKey, number]> => { + return await anchor.web3.PublicKey.findProgramAddress( + [Buffer.from('fair_launch'), tokenMint.toBuffer(), Buffer.from('lottery')], + FAIR_LAUNCH_PROGRAM_ID, + ); +}; + export const getFairLaunchTicketSeqLookup = async ( tokenMint: anchor.web3.PublicKey, seq: anchor.BN, diff --git a/rust/fair-launch/src/lib.rs b/rust/fair-launch/src/lib.rs index 1e2b2b6..64e18bc 100644 --- a/rust/fair-launch/src/lib.rs +++ b/rust/fair-launch/src/lib.rs @@ -448,12 +448,6 @@ pub mod fair_launch { adjust_counts(fair_launch, amount, Some(fair_launch_ticket.amount))?; - let signer_seeds = [ - PREFIX.as_bytes(), - fair_launch.token_mint.as_ref(), - &[fair_launch.bump], - ]; - if let Some(treasury_mint) = fair_launch.treasury_mint { let treasury_mint_info = &ctx.remaining_accounts[0]; let _treasury_mint: spl_token::state::Mint = assert_initialized(&treasury_mint_info)?; @@ -495,6 +489,12 @@ pub mod fair_launch { return Err(ErrorCode::AccountShouldHaveNoDelegates.into()); } + let signer_seeds = [ + PREFIX.as_bytes(), + fair_launch.token_mint.as_ref(), + &[fair_launch.bump], + ]; + if amount > fair_launch_ticket.amount { let difference = amount .checked_sub(fair_launch_ticket.amount) @@ -551,6 +551,13 @@ pub mod fair_launch { .checked_sub(amount) .ok_or(ErrorCode::NumericalOverflowError)?; + let treasury_signer_seeds = [ + PREFIX.as_bytes(), + fair_launch.token_mint.as_ref(), + TREASURY.as_bytes(), + &[fair_launch.treasury_bump], + ]; + invoke_signed( &system_instruction::transfer(ctx.accounts.treasury.key, buyer.key, difference), &[ @@ -558,7 +565,7 @@ pub mod fair_launch { ctx.accounts.treasury.clone(), ctx.accounts.system_program.clone(), ], - &[&signer_seeds], + &[&treasury_signer_seeds], )?; } }