swap.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import * as anchor from '@coral-xyz/anchor';
  2. import type { Program } from '@coral-xyz/anchor';
  3. import { BN } from 'bn.js';
  4. import { expect } from 'chai';
  5. import type { SwapExample } from '../target/types/swap_example';
  6. import { type TestValues, createValues, mintingTokens } from './utils';
  7. describe('Swap', () => {
  8. const provider = anchor.AnchorProvider.env();
  9. const connection = provider.connection;
  10. anchor.setProvider(provider);
  11. const program = anchor.workspace.SwapExample as Program<SwapExample>;
  12. let values: TestValues;
  13. beforeEach(async () => {
  14. values = createValues();
  15. await program.methods.createAmm(values.id, values.fee).accounts({ amm: values.ammKey, admin: values.admin.publicKey }).rpc();
  16. await mintingTokens({
  17. connection,
  18. creator: values.admin,
  19. mintAKeypair: values.mintAKeypair,
  20. mintBKeypair: values.mintBKeypair,
  21. });
  22. await program.methods
  23. .createPool()
  24. .accounts({
  25. amm: values.ammKey,
  26. pool: values.poolKey,
  27. poolAuthority: values.poolAuthority,
  28. mintLiquidity: values.mintLiquidity,
  29. mintA: values.mintAKeypair.publicKey,
  30. mintB: values.mintBKeypair.publicKey,
  31. poolAccountA: values.poolAccountA,
  32. poolAccountB: values.poolAccountB,
  33. })
  34. .rpc();
  35. await program.methods
  36. .depositLiquidity(values.depositAmountA, values.depositAmountB)
  37. .accounts({
  38. pool: values.poolKey,
  39. poolAuthority: values.poolAuthority,
  40. depositor: values.admin.publicKey,
  41. mintLiquidity: values.mintLiquidity,
  42. mintA: values.mintAKeypair.publicKey,
  43. mintB: values.mintBKeypair.publicKey,
  44. poolAccountA: values.poolAccountA,
  45. poolAccountB: values.poolAccountB,
  46. depositorAccountLiquidity: values.liquidityAccount,
  47. depositorAccountA: values.holderAccountA,
  48. depositorAccountB: values.holderAccountB,
  49. })
  50. .signers([values.admin])
  51. .rpc({ skipPreflight: true });
  52. });
  53. it('Swap from A to B', async () => {
  54. const input = new BN(10 ** 6);
  55. await program.methods
  56. .swapExactTokensForTokens(true, input, new BN(100))
  57. .accounts({
  58. amm: values.ammKey,
  59. pool: values.poolKey,
  60. poolAuthority: values.poolAuthority,
  61. trader: values.admin.publicKey,
  62. mintA: values.mintAKeypair.publicKey,
  63. mintB: values.mintBKeypair.publicKey,
  64. poolAccountA: values.poolAccountA,
  65. poolAccountB: values.poolAccountB,
  66. traderAccountA: values.holderAccountA,
  67. traderAccountB: values.holderAccountB,
  68. })
  69. .signers([values.admin])
  70. .rpc({ skipPreflight: true });
  71. const traderTokenAccountA = await connection.getTokenAccountBalance(values.holderAccountA);
  72. const traderTokenAccountB = await connection.getTokenAccountBalance(values.holderAccountB);
  73. expect(traderTokenAccountA.value.amount).to.equal(values.defaultSupply.sub(values.depositAmountA).sub(input).toString());
  74. expect(Number(traderTokenAccountB.value.amount)).to.be.greaterThan(values.defaultSupply.sub(values.depositAmountB).toNumber());
  75. expect(Number(traderTokenAccountB.value.amount)).to.be.lessThan(values.defaultSupply.sub(values.depositAmountB).add(input).toNumber());
  76. });
  77. });