counter.test.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import type { bignum } from '@metaplex-foundation/beet';
  2. import {
  3. Connection,
  4. Keypair,
  5. LAMPORTS_PER_SOL,
  6. SystemProgram,
  7. Transaction,
  8. type TransactionInstruction,
  9. sendAndConfirmTransaction,
  10. } from '@solana/web3.js';
  11. import { BN } from 'bn.js';
  12. import { assert } from 'chai';
  13. import { Counter, PROGRAM_ID, createIncrementInstruction } from '../ts';
  14. function convertBignumToNumber(bignum: bignum): number {
  15. return new BN(bignum).toNumber();
  16. }
  17. describe('Counter Solana Native', () => {
  18. const connection = new Connection('http://localhost:8899');
  19. it('Test allocate counter + increment tx', async () => {
  20. // Randomly generate our wallet
  21. const payerKeypair = Keypair.generate();
  22. const payer = payerKeypair.publicKey;
  23. // Randomly generate the account key
  24. // to sign for setting up the Counter state
  25. const counterKeypair = Keypair.generate();
  26. const counter = counterKeypair.publicKey;
  27. // Airdrop our wallet 1 Sol
  28. await connection.requestAirdrop(payer, LAMPORTS_PER_SOL);
  29. // Create a TransactionInstruction to interact with our counter program
  30. const allocIx: TransactionInstruction = SystemProgram.createAccount({
  31. fromPubkey: payer,
  32. newAccountPubkey: counter,
  33. lamports: await connection.getMinimumBalanceForRentExemption(Counter.byteSize),
  34. space: Counter.byteSize,
  35. programId: PROGRAM_ID,
  36. });
  37. const incrementIx: TransactionInstruction = createIncrementInstruction({
  38. counter,
  39. });
  40. const tx = new Transaction().add(allocIx).add(incrementIx);
  41. // Explicitly set the feePayer to be our wallet (this is set to first signer by default)
  42. tx.feePayer = payer;
  43. // Fetch a "timestamp" so validators know this is a recent transaction
  44. tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash;
  45. // Send transaction to network (local network)
  46. await sendAndConfirmTransaction(connection, tx, [payerKeypair, counterKeypair], { skipPreflight: true, commitment: 'confirmed' });
  47. // Get the counter account info from network
  48. const count = (await Counter.fromAccountAddress(connection, counter)).count;
  49. assert(new BN(count).toNumber() === 1, 'Expected count to have been 1');
  50. console.log(`[alloc+increment] count is: ${count}`);
  51. });
  52. it('Test allocate tx and increment tx', async () => {
  53. const payerKeypair = Keypair.generate();
  54. const payer = payerKeypair.publicKey;
  55. const counterKeypair = Keypair.generate();
  56. const counter = counterKeypair.publicKey;
  57. await connection.requestAirdrop(payer, LAMPORTS_PER_SOL);
  58. // Check allocate tx
  59. const allocIx: TransactionInstruction = SystemProgram.createAccount({
  60. fromPubkey: payer,
  61. newAccountPubkey: counter,
  62. lamports: await connection.getMinimumBalanceForRentExemption(Counter.byteSize),
  63. space: Counter.byteSize,
  64. programId: PROGRAM_ID,
  65. });
  66. let tx = new Transaction().add(allocIx);
  67. tx.feePayer = payer;
  68. tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash;
  69. await sendAndConfirmTransaction(connection, tx, [payerKeypair, counterKeypair], { skipPreflight: true, commitment: 'confirmed' });
  70. let count = (await Counter.fromAccountAddress(connection, counter)).count;
  71. assert(convertBignumToNumber(count) === 0, 'Expected count to have been 0');
  72. console.log(`[allocate] count is: ${count}`);
  73. // Check increment tx
  74. const incrementIx: TransactionInstruction = createIncrementInstruction({
  75. counter,
  76. });
  77. tx = new Transaction().add(incrementIx);
  78. tx.feePayer = payer;
  79. tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash;
  80. await sendAndConfirmTransaction(connection, tx, [payerKeypair], {
  81. skipPreflight: true,
  82. commitment: 'confirmed',
  83. });
  84. count = (await Counter.fromAccountAddress(connection, counter)).count;
  85. assert(convertBignumToNumber(count) === 1, 'Expected count to have been 1');
  86. console.log(`[increment] count is: ${count}`);
  87. });
  88. });