import { Keypair, Transaction } from "@solana/web3.js"; import { BN, Program } from "@project-serum/anchor"; import { PsyStake } from "../target/types/psy_stake"; const { TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID, Token, } = require("@solana/spl-token"); const MIN_EPOCH_DURATION = 5; const MAX_REWARD_POOLS = 3; const createUserWalletAndTokenAccounts = async ( provider, userWalletKeypair, mintAuthority, network ) => { // Fund user wallet with some SOL. await provider.connection.confirmTransaction( await provider.connection.requestAirdrop( userWalletKeypair.publicKey, 10_000_000_000 ), "confirmed" ); let userUsdcTokenAccount = await Token.getAssociatedTokenAddress( ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, network.usdcToken.publicKey, userWalletKeypair.publicKey ); // Get the instructions to add to the RPC call let createUserUsdcInstr = Token.createAssociatedTokenAccountInstruction( ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, network.usdcToken.publicKey, userUsdcTokenAccount, userWalletKeypair.publicKey, provider.wallet.publicKey ); let createUserUsdcTrns = new Transaction().add(createUserUsdcInstr); await provider.send(createUserUsdcTrns); let userBtcTokenAccount = await Token.getAssociatedTokenAddress( ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, network.btcToken.publicKey, userWalletKeypair.publicKey ); // Get the instructions to add to the RPC call let createUserBtcInstr = Token.createAssociatedTokenAccountInstruction( ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, network.btcToken.publicKey, userBtcTokenAccount, userWalletKeypair.publicKey, provider.wallet.publicKey ); let createUserBtcTrns = new Transaction().add(createUserBtcInstr); await provider.send(createUserBtcTrns); await network.btcToken.mintTo( userBtcTokenAccount, mintAuthority, [], 10 ** 10 ); await network.usdcToken.mintTo( userUsdcTokenAccount, mintAuthority, [], 10 ** 10 ); return [userUsdcTokenAccount, userBtcTokenAccount]; }; const setupTestAccounts = async ( program: Program, provider, collateralDecimals = 6, quoteDecimals = 6 ) => { let userWalletKeypair = Keypair.generate(); let userWalletKeypair2 = Keypair.generate(); let mintAuthority = Keypair.generate(); let stakePoolAuthority = Keypair.generate(); let rewardPoolAuthority = Keypair.generate(); // Airdrop SOL to accounts to pay for transactions. await provider.connection.confirmTransaction( await provider.connection.requestAirdrop( mintAuthority.publicKey, 10_000_000_000 ), "confirmed" ); await provider.connection.confirmTransaction( await provider.connection.requestAirdrop( stakePoolAuthority.publicKey, 10_000_000_000 ), "confirmed" ); let network: any = {}; // // The following are SPL Tokens assumed to be already existing and created by third party. network.usdcToken = await Token.createMint( /*connection=*/ provider.connection, /*payer=*/ mintAuthority, /*mintAuthority=*/ mintAuthority.publicKey, /*freezeAuthority=*/ null, /*decimals=*/ collateralDecimals, /*programId=*/ TOKEN_PROGRAM_ID ); network.btcToken = await Token.createMint( /*connection=*/ provider.connection, /*payer=*/ mintAuthority, /*mintAuthority=*/ mintAuthority.publicKey, /*freezeAuthority=*/ null, /*decimals=*/ quoteDecimals, /*programId=*/ TOKEN_PROGRAM_ID ); const [userUsdcTokenAccount, userBtcTokenAccount] = await createUserWalletAndTokenAccounts( provider, userWalletKeypair, mintAuthority, network ); const [userUsdcTokenAccount2, userBtcTokenAccount2] = await createUserWalletAndTokenAccounts( provider, userWalletKeypair2, mintAuthority, network ); return { userWalletKeypair, userUsdcTokenAccount, userBtcTokenAccount, userWalletKeypair2, userUsdcTokenAccount2, userBtcTokenAccount2, network, mintAuthority, stakePoolAuthority, rewardPoolAuthority, }; }; module.exports = { setupTestAccounts, MAX_REWARD_POOLS, MIN_EPOCH_DURATION, };