swap.ts 3.3 KB

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