withdraw-liquidity.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import * as anchor from '@coral-xyz/anchor';
  2. import type { Program } from '@coral-xyz/anchor';
  3. import { expect } from 'chai';
  4. import type { SwapExample } from '../target/types/swap_example';
  5. import { type 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.createAmm(values.id, values.fee).accounts({ amm: values.ammKey, admin: values.admin.publicKey }).rpc();
  15. await mintingTokens({
  16. connection,
  17. creator: values.admin,
  18. mintAKeypair: values.mintAKeypair,
  19. mintBKeypair: values.mintBKeypair,
  20. });
  21. await program.methods
  22. .createPool()
  23. .accounts({
  24. amm: values.ammKey,
  25. pool: values.poolKey,
  26. poolAuthority: values.poolAuthority,
  27. mintLiquidity: values.mintLiquidity,
  28. mintA: values.mintAKeypair.publicKey,
  29. mintB: values.mintBKeypair.publicKey,
  30. poolAccountA: values.poolAccountA,
  31. poolAccountB: values.poolAccountB,
  32. })
  33. .rpc();
  34. await program.methods
  35. .depositLiquidity(values.depositAmountA, values.depositAmountA)
  36. .accounts({
  37. pool: values.poolKey,
  38. poolAuthority: values.poolAuthority,
  39. depositor: values.admin.publicKey,
  40. mintLiquidity: values.mintLiquidity,
  41. mintA: values.mintAKeypair.publicKey,
  42. mintB: values.mintBKeypair.publicKey,
  43. poolAccountA: values.poolAccountA,
  44. poolAccountB: values.poolAccountB,
  45. depositorAccountLiquidity: values.liquidityAccount,
  46. depositorAccountA: values.holderAccountA,
  47. depositorAccountB: values.holderAccountB,
  48. })
  49. .signers([values.admin])
  50. .rpc({ skipPreflight: true });
  51. });
  52. it('Withdraw everything', async () => {
  53. await program.methods
  54. .withdrawLiquidity(values.depositAmountA.sub(values.minimumLiquidity))
  55. .accounts({
  56. amm: values.ammKey,
  57. pool: values.poolKey,
  58. poolAuthority: values.poolAuthority,
  59. depositor: values.admin.publicKey,
  60. mintLiquidity: values.mintLiquidity,
  61. mintA: values.mintAKeypair.publicKey,
  62. mintB: values.mintBKeypair.publicKey,
  63. poolAccountA: values.poolAccountA,
  64. poolAccountB: values.poolAccountB,
  65. depositorAccountLiquidity: values.liquidityAccount,
  66. depositorAccountA: values.holderAccountA,
  67. depositorAccountB: values.holderAccountB,
  68. })
  69. .signers([values.admin])
  70. .rpc({ skipPreflight: true });
  71. const liquidityTokenAccount = await connection.getTokenAccountBalance(values.liquidityAccount);
  72. const depositTokenAccountA = await connection.getTokenAccountBalance(values.holderAccountA);
  73. const depositTokenAccountB = await connection.getTokenAccountBalance(values.holderAccountB);
  74. expect(liquidityTokenAccount.value.amount).to.equal('0');
  75. expect(Number(depositTokenAccountA.value.amount)).to.be.lessThan(values.defaultSupply.toNumber());
  76. expect(Number(depositTokenAccountA.value.amount)).to.be.greaterThan(values.defaultSupply.sub(values.depositAmountA).toNumber());
  77. expect(Number(depositTokenAccountB.value.amount)).to.be.lessThan(values.defaultSupply.toNumber());
  78. expect(Number(depositTokenAccountB.value.amount)).to.be.greaterThan(values.defaultSupply.sub(values.depositAmountA).toNumber());
  79. });
  80. });