withdraw-liquidity.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import * as anchor from "@coral-xyz/anchor";
  2. import { Program } from "@coral-xyz/anchor";
  3. import { SwapExample } from "../target/types/swap_example";
  4. import { expect } from "chai";
  5. import { TestValues, createValues, mintingTokens } from "./utils";
  6. describe("Withdraw liquidity", () => {
  7. const provider = anchor.AnchorProvider.env();
  8. const connection = provider.connection;
  9. anchor.setProvider(provider);
  10. const program = anchor.workspace.SwapExample as Program<SwapExample>;
  11. let values: TestValues;
  12. beforeEach(async () => {
  13. values = createValues();
  14. await program.methods
  15. .createAmm(values.id, values.fee)
  16. .accounts({ amm: values.ammKey, admin: values.admin.publicKey })
  17. .rpc();
  18. await mintingTokens({
  19. connection,
  20. creator: values.admin,
  21. mintAKeypair: values.mintAKeypair,
  22. mintBKeypair: values.mintBKeypair,
  23. });
  24. await program.methods
  25. .createPool()
  26. .accounts({
  27. amm: values.ammKey,
  28. pool: values.poolKey,
  29. poolAuthority: values.poolAuthority,
  30. mintLiquidity: values.mintLiquidity,
  31. mintA: values.mintAKeypair.publicKey,
  32. mintB: values.mintBKeypair.publicKey,
  33. poolAccountA: values.poolAccountA,
  34. poolAccountB: values.poolAccountB,
  35. })
  36. .rpc();
  37. await program.methods
  38. .depositLiquidity(values.depositAmountA, values.depositAmountA)
  39. .accounts({
  40. pool: values.poolKey,
  41. poolAuthority: values.poolAuthority,
  42. depositor: values.admin.publicKey,
  43. mintLiquidity: values.mintLiquidity,
  44. mintA: values.mintAKeypair.publicKey,
  45. mintB: values.mintBKeypair.publicKey,
  46. poolAccountA: values.poolAccountA,
  47. poolAccountB: values.poolAccountB,
  48. depositorAccountLiquidity: values.liquidityAccount,
  49. depositorAccountA: values.holderAccountA,
  50. depositorAccountB: values.holderAccountB,
  51. })
  52. .signers([values.admin])
  53. .rpc({ skipPreflight: true });
  54. });
  55. it("Withdraw everything", async () => {
  56. await program.methods
  57. .withdrawLiquidity(values.depositAmountA.sub(values.minimumLiquidity))
  58. .accounts({
  59. amm: values.ammKey,
  60. pool: values.poolKey,
  61. poolAuthority: values.poolAuthority,
  62. depositor: values.admin.publicKey,
  63. mintLiquidity: values.mintLiquidity,
  64. mintA: values.mintAKeypair.publicKey,
  65. mintB: values.mintBKeypair.publicKey,
  66. poolAccountA: values.poolAccountA,
  67. poolAccountB: values.poolAccountB,
  68. depositorAccountLiquidity: values.liquidityAccount,
  69. depositorAccountA: values.holderAccountA,
  70. depositorAccountB: values.holderAccountB,
  71. })
  72. .signers([values.admin])
  73. .rpc({ skipPreflight: true });
  74. const liquidityTokenAccount = await connection.getTokenAccountBalance(
  75. values.liquidityAccount
  76. );
  77. const depositTokenAccountA = await connection.getTokenAccountBalance(
  78. values.holderAccountA
  79. );
  80. const depositTokenAccountB = await connection.getTokenAccountBalance(
  81. values.holderAccountB
  82. );
  83. expect(liquidityTokenAccount.value.amount).to.equal("0");
  84. expect(Number(depositTokenAccountA.value.amount)).to.be.lessThan(
  85. values.defaultSupply.toNumber()
  86. );
  87. expect(Number(depositTokenAccountA.value.amount)).to.be.greaterThan(
  88. values.defaultSupply.sub(values.depositAmountA).toNumber()
  89. );
  90. expect(Number(depositTokenAccountB.value.amount)).to.be.lessThan(
  91. values.defaultSupply.toNumber()
  92. );
  93. expect(Number(depositTokenAccountB.value.amount)).to.be.greaterThan(
  94. values.defaultSupply.sub(values.depositAmountA).toNumber()
  95. );
  96. });
  97. });