call_anchor.spec.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // SPDX-License-Identifier: Apache-2.0
  2. import expect from 'expect';
  3. import { AnchorProvider, Program } from '@coral-xyz/anchor';
  4. import {
  5. PublicKey, AccountMeta,
  6. Keypair,
  7. Connection,
  8. LAMPORTS_PER_SOL,
  9. BpfLoader, Transaction,
  10. BPF_LOADER_PROGRAM_ID, SystemProgram, sendAndConfirmTransaction,
  11. } from '@solana/web3.js';
  12. import * as fs from "fs";
  13. async function newAccountWithLamports(connection: Connection): Promise<Keypair> {
  14. const account = Keypair.generate();
  15. let signature = await connection.requestAirdrop(account.publicKey, 16 * LAMPORTS_PER_SOL);
  16. await connection.confirmTransaction(signature, 'confirmed');
  17. return account;
  18. }
  19. describe('Call Anchor program from Solidity via IDL', () => {
  20. it('call_anchor', async function () {
  21. // This program instantiates an anchor program, calls various functions on it and checks the return values
  22. const connection = new Connection("http://localhost:8899", {
  23. commitment: "confirmed",
  24. confirmTransactionInitialTimeout: 1e6,
  25. });
  26. const payer = await newAccountWithLamports(connection);
  27. const callAnchorProgramId = Keypair.generate();
  28. await BpfLoader.load(connection, payer, callAnchorProgramId, fs.readFileSync("./tests/call_anchor.so"), BPF_LOADER_PROGRAM_ID);
  29. const file_name = "call_anchor";
  30. const idl = JSON.parse(fs.readFileSync("tests/" + file_name + ".json", 'utf8'));
  31. const storage = Keypair.generate();
  32. const provider = AnchorProvider.env();
  33. const data = Keypair.generate();
  34. await create_account(provider, storage, callAnchorProgramId.publicKey, 8192);
  35. const program = new Program(idl, callAnchorProgramId.publicKey, provider);
  36. // create account
  37. await program.methods.new(data.publicKey)
  38. .accounts({ dataAccount: storage.publicKey })
  39. .rpc();
  40. const ret = await program.methods.data().accounts({ dataAccount: storage.publicKey }).view();
  41. expect(ret).toEqual(data.publicKey);
  42. const anchor_program_id = new PublicKey("z7FbDfQDfucxJz5o8jrGLgvSbdoeSqX5VrxBb5TVjHq");
  43. const remainingAccounts: AccountMeta[] = [{
  44. pubkey: data.publicKey,
  45. isSigner: true,
  46. isWritable: true,
  47. }, {
  48. pubkey: payer.publicKey,
  49. isSigner: true,
  50. isWritable: true,
  51. }];
  52. await program.methods.test(payer.publicKey)
  53. .accounts({
  54. dataAccount: storage.publicKey,
  55. anchor_programId: anchor_program_id,
  56. })
  57. .remainingAccounts(remainingAccounts)
  58. .signers([data, payer])
  59. .rpc();
  60. let seen = false;
  61. const listenId = program.addEventListener("MyEvent", (ev) => {
  62. expect(ev.data.toNumber()).toBe(102);
  63. expect(ev.label).toBe("yadayada");
  64. seen = true;
  65. });
  66. await program.methods.testEvent()
  67. .accounts({
  68. dataAccount: storage.publicKey,
  69. })
  70. .rpc();
  71. program.removeEventListener(listenId);
  72. expect(seen).toBe(true);
  73. });
  74. });
  75. async function create_account(provider: AnchorProvider, account: Keypair, programId: PublicKey, space: number) {
  76. const lamports = await provider.connection.getMinimumBalanceForRentExemption(space);
  77. const transaction = new Transaction();
  78. transaction.add(
  79. SystemProgram.createAccount({
  80. fromPubkey: provider.wallet.publicKey,
  81. newAccountPubkey: account.publicKey,
  82. lamports,
  83. space,
  84. programId,
  85. }));
  86. await provider.sendAndConfirm(transaction, [account]);
  87. }