123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- const assert = require("assert");
- const { Token } = require("@solana/spl-token");
- const anchor = require("@project-serum/anchor");
- const serumCmn = require("@project-serum/common");
- const { Market } = require("@project-serum/serum");
- const { PublicKey, SystemProgram, SYSVAR_RENT_PUBKEY } = anchor.web3;
- const utils = require("./utils");
- const { setupStakePool } = require("./utils/stake");
- const DEX_PID = new PublicKey("9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin");
- const SWAP_PID = new PublicKey("22Y43yTVxuUkoRKdm9thyRhQ3SdgQS7c7kB6UNCiaczD");
- const TOKEN_PID = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
- const REGISTRY_PID = new PublicKey(
- "GrAkKfEpTKQuVHG2Y97Y2FF4i7y7Q5AHLK94JBy7Y5yv"
- );
- const LOCKUP_PID = new PublicKey(
- "6ebQNeTPZ1j7k3TtkCCtEPRvG7GQsucQrZ7sSEDQi9Ks"
- );
- const FEES = "6160355581";
- describe("cfo", () => {
- anchor.setProvider(anchor.Provider.env());
- const program = anchor.workspace.Cfo;
- let officer;
- let TOKEN_CLIENT;
- let officerAccount;
- const sweepAuthority = program.provider.wallet.publicKey;
- // Accounts used to setup the orderbook.
- let ORDERBOOK_ENV,
- // Accounts used for A -> USDC swap transactions.
- SWAP_A_USDC_ACCOUNTS,
- // Accounts used for USDC -> A swap transactions.
- SWAP_USDC_A_ACCOUNTS,
- // Serum DEX vault PDA for market A/USDC.
- marketAVaultSigner,
- // Serum DEX vault PDA for market B/USDC.
- marketBVaultSigner;
- let registrar, msrmRegistrar;
- it("BOILERPLATE: Sets up a market with funded fees", async () => {
- ORDERBOOK_ENV = await utils.initMarket({
- provider: program.provider,
- });
- console.log("Token A: ", ORDERBOOK_ENV.marketA.baseMintAddress.toString());
- console.log(
- "Token USDC: ",
- ORDERBOOK_ENV.marketA.quoteMintAddress.toString()
- );
- TOKEN_CLIENT = new Token(
- program.provider.connection,
- ORDERBOOK_ENV.usdc,
- TOKEN_PID,
- program.provider.wallet.payer
- );
- await TOKEN_CLIENT.transfer(
- ORDERBOOK_ENV.godUsdc,
- ORDERBOOK_ENV.marketA._decoded.quoteVault,
- program.provider.wallet.payer,
- [],
- 10000000000000
- );
- const tokenAccount = await TOKEN_CLIENT.getAccountInfo(
- ORDERBOOK_ENV.marketA._decoded.quoteVault
- );
- assert.ok(tokenAccount.amount.toString() === "10000902263700");
- });
- it("BOILERPLATE: Executes trades to generate fees", async () => {
- await utils.runTradeBot(
- ORDERBOOK_ENV.marketA._decoded.ownAddress,
- program.provider,
- 1
- );
- let marketClient = await Market.load(
- program.provider.connection,
- ORDERBOOK_ENV.marketA._decoded.ownAddress,
- { commitment: "recent" },
- DEX_PID
- );
- assert.ok(marketClient._decoded.quoteFeesAccrued.toString() === FEES);
- });
- it("BOILERPLATE: Sets up the staking pools", async () => {
- await setupStakePool(ORDERBOOK_ENV.mintA, ORDERBOOK_ENV.godA);
- registrar = ORDERBOOK_ENV.usdc;
- msrmRegistrar = registrar;
- });
- it("Creates a CFO!", async () => {
- let distribution = {
- burn: 80,
- stake: 20,
- treasury: 0,
- };
- officer = await program.account.officer.associatedAddress(DEX_PID);
- const srmVault = await anchor.utils.publicKey.associated(
- program.programId,
- officer,
- anchor.utils.bytes.utf8.encode("vault"),
- );
- const stake = await anchor.utils.publicKey.associated(
- program.programId,
- officer,
- anchor.utils.bytes.utf8.encode("stake"),
- );
- const treasury = await anchor.utils.publicKey.associated(
- program.programId,
- officer,
- Buffer.from(anchor.utils.bytes.utf8.encode("treasury")),
- );
- await program.rpc.createOfficer(distribution, registrar, msrmRegistrar, {
- accounts: {
- officer,
- srmVault,
- stake,
- treasury,
- mint: ORDERBOOK_ENV.mintA,
- authority: program.provider.wallet.publicKey,
- dexProgram: DEX_PID,
- swapProgram: SWAP_PID,
- tokenProgram: TOKEN_PID,
- systemProgram: SystemProgram.programId,
- rent: SYSVAR_RENT_PUBKEY,
- },
- });
- officerAccount = await program.account.officer.associated(DEX_PID);
- assert.ok(
- officerAccount.authority.equals(program.provider.wallet.publicKey)
- );
- assert.ok(
- JSON.stringify(officerAccount.distribution) ===
- JSON.stringify(distribution)
- );
- });
- it("Creates a token account for the officer associated with the market", async () => {
- const token = await anchor.utils.publicKey.associated(
- program.programId,
- officer,
- ORDERBOOK_ENV.usdc
- );
- await program.rpc.createOfficerToken({
- accounts: {
- officer,
- token,
- mint: ORDERBOOK_ENV.usdc,
- payer: program.provider.wallet.publicKey,
- systemProgram: SystemProgram.programId,
- tokenProgram: TOKEN_PID,
- rent: SYSVAR_RENT_PUBKEY,
- },
- });
- const tokenAccount = await TOKEN_CLIENT.getAccountInfo(token);
- assert.ok(tokenAccount.state === 1);
- assert.ok(tokenAccount.isInitialized);
- });
- it("Sweeps fees", async () => {
- const sweepVault = await anchor.utils.publicKey.associated(
- program.programId,
- officer,
- ORDERBOOK_ENV.usdc
- );
- const beforeTokenAccount = await serumCmn.getTokenAccount(
- program.provider,
- sweepVault
- );
- await program.rpc.sweepFees({
- accounts: {
- officer,
- sweepVault,
- mint: ORDERBOOK_ENV.usdc,
- dex: {
- market: ORDERBOOK_ENV.marketA._decoded.ownAddress,
- pcVault: ORDERBOOK_ENV.marketA._decoded.quoteVault,
- sweepAuthority,
- vaultSigner: ORDERBOOK_ENV.vaultSigner,
- dexProgram: DEX_PID,
- tokenProgram: TOKEN_PID,
- },
- },
- });
- const afterTokenAccount = await serumCmn.getTokenAccount(
- program.provider,
- sweepVault
- );
- assert.ok(
- afterTokenAccount.amount.sub(beforeTokenAccount.amount).toString() ===
- FEES
- );
- });
- it("TODO", async () => {
- // todo
- });
- });
|