|
| 1 | +import "should"; |
| 2 | +import { initLog } from "../../utils/log.util"; |
| 3 | +import { before } from "mocha"; |
| 4 | +import { Mint } from "@solana/spl-token"; |
| 5 | +import { TokenUtil } from "../../utils/token.util"; |
| 6 | +import { Keypair, PublicKey } from "@solana/web3.js"; |
| 7 | +import { TestUtil } from "../../utils/config.util"; |
| 8 | +import { deployVault, deployVaultProtoConfig } from "../../utils/setup.util"; |
| 9 | +import { findAssociatedTokenAddress } from "../../utils/common.util"; |
| 10 | +import { VaultUtil } from "../../utils/vault.util"; |
| 11 | +import { SolUtil } from "../../utils/sol.util"; |
| 12 | + |
| 13 | +describe("#adminWithdraw", () => { |
| 14 | + initLog(); |
| 15 | + |
| 16 | + let tokensAuthority: Keypair; |
| 17 | + let vaultAdmin: Keypair; |
| 18 | + let tokenA: Mint, tokenB: Mint; |
| 19 | + let vaultProtoConfig: PublicKey; |
| 20 | + let vault: PublicKey; |
| 21 | + let vaultTokenAAccount: PublicKey, vaultTokenBAccount: PublicKey; |
| 22 | + |
| 23 | + before(async () => { |
| 24 | + tokensAuthority = Keypair.generate(); |
| 25 | + vaultAdmin = Keypair.generate(); |
| 26 | + |
| 27 | + await SolUtil.fundAccount( |
| 28 | + tokensAuthority.publicKey, |
| 29 | + SolUtil.solToLamports(0.1), |
| 30 | + ); |
| 31 | + await SolUtil.fundAccount(vaultAdmin.publicKey, SolUtil.solToLamports(0.1)); |
| 32 | + |
| 33 | + [tokenA, tokenB] = await TokenUtil.createMints( |
| 34 | + [tokensAuthority.publicKey, tokensAuthority.publicKey], |
| 35 | + [6, 9], |
| 36 | + ); |
| 37 | + }); |
| 38 | + |
| 39 | + beforeEach(async () => { |
| 40 | + vaultProtoConfig = await deployVaultProtoConfig( |
| 41 | + 1, |
| 42 | + 5, |
| 43 | + 5, |
| 44 | + 0, |
| 45 | + vaultAdmin.publicKey, |
| 46 | + ); |
| 47 | + const vaultTreasuryTokenBAccount = await TokenUtil.createTokenAccount( |
| 48 | + tokenB, |
| 49 | + TestUtil.provider.publicKey, |
| 50 | + tokensAuthority, |
| 51 | + ); |
| 52 | + |
| 53 | + const vaultPDA = await deployVault( |
| 54 | + tokenA.address, |
| 55 | + tokenB.address, |
| 56 | + vaultTreasuryTokenBAccount, |
| 57 | + vaultProtoConfig, |
| 58 | + undefined, |
| 59 | + vaultAdmin, |
| 60 | + ); |
| 61 | + |
| 62 | + vault = vaultPDA.publicKey; |
| 63 | + vaultTokenAAccount = await findAssociatedTokenAddress( |
| 64 | + vaultPDA.publicKey, |
| 65 | + tokenA.address, |
| 66 | + ); |
| 67 | + vaultTokenBAccount = await findAssociatedTokenAddress( |
| 68 | + vaultPDA.publicKey, |
| 69 | + tokenB.address, |
| 70 | + ); |
| 71 | + await TokenUtil.mintTo({ |
| 72 | + payer: tokensAuthority, |
| 73 | + token: tokenA, |
| 74 | + mintAuthority: tokensAuthority, |
| 75 | + recipient: vaultTokenAAccount, |
| 76 | + amount: BigInt(1_000_000_000), |
| 77 | + }); |
| 78 | + await TokenUtil.mintTo({ |
| 79 | + payer: tokensAuthority, |
| 80 | + token: tokenB, |
| 81 | + mintAuthority: tokensAuthority, |
| 82 | + recipient: vaultTokenBAccount, |
| 83 | + amount: BigInt(1_000_000_000), |
| 84 | + }); |
| 85 | + }); |
| 86 | + |
| 87 | + it("allows admin to withdraw funds to admin's token B account", async () => { |
| 88 | + const adminTokenAccount = await TokenUtil.getOrCreateAssociatedTokenAccount( |
| 89 | + tokenB, |
| 90 | + vaultAdmin.publicKey, |
| 91 | + tokensAuthority, |
| 92 | + ); |
| 93 | + const adminTokenBBalanceBefore = |
| 94 | + await TokenUtil.getTokenAccount(adminTokenAccount); |
| 95 | + adminTokenBBalanceBefore.amount.toString().should.equal("0"); |
| 96 | + await VaultUtil.adminWithdraw( |
| 97 | + vault, |
| 98 | + vaultTokenBAccount, |
| 99 | + adminTokenAccount, |
| 100 | + vaultProtoConfig, |
| 101 | + vaultAdmin, |
| 102 | + ); |
| 103 | + const adminTokenBBalanceAfter = |
| 104 | + await TokenUtil.getTokenAccount(adminTokenAccount); |
| 105 | + adminTokenBBalanceAfter.amount.toString().should.equal("1000000000"); |
| 106 | + }); |
| 107 | + |
| 108 | + it("allows admin to withdraw funds to admin's token A account", async () => { |
| 109 | + const adminTokenAccount = await TokenUtil.getOrCreateAssociatedTokenAccount( |
| 110 | + tokenA, |
| 111 | + vaultAdmin.publicKey, |
| 112 | + tokensAuthority, |
| 113 | + ); |
| 114 | + const adminTokenABalanceBefore = |
| 115 | + await TokenUtil.getTokenAccount(adminTokenAccount); |
| 116 | + adminTokenABalanceBefore.amount.toString().should.equal("0"); |
| 117 | + await VaultUtil.adminWithdraw( |
| 118 | + vault, |
| 119 | + vaultTokenAAccount, |
| 120 | + adminTokenAccount, |
| 121 | + vaultProtoConfig, |
| 122 | + vaultAdmin, |
| 123 | + ); |
| 124 | + const adminTokenABalanceAfter = |
| 125 | + await TokenUtil.getTokenAccount(adminTokenAccount); |
| 126 | + adminTokenABalanceAfter.amount.toString().should.equal("1000000000"); |
| 127 | + }); |
| 128 | + |
| 129 | + it("does not allow non-admin to withdraw", async () => { |
| 130 | + const adminTokenAccount = await TokenUtil.getOrCreateAssociatedTokenAccount( |
| 131 | + tokenB, |
| 132 | + vaultAdmin.publicKey, |
| 133 | + tokensAuthority, |
| 134 | + ); |
| 135 | + await VaultUtil.adminWithdraw( |
| 136 | + vault, |
| 137 | + vaultTokenBAccount, |
| 138 | + adminTokenAccount, |
| 139 | + vaultProtoConfig, |
| 140 | + tokensAuthority, |
| 141 | + ).should.be.rejectedWith(/0x1785/); |
| 142 | + }); |
| 143 | +}); |
0 commit comments