_setup.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import {
  2. Address,
  3. Commitment,
  4. CompilableTransactionMessage,
  5. TransactionMessageWithBlockhashLifetime,
  6. ProgramDerivedAddress,
  7. Rpc,
  8. RpcSubscriptions,
  9. SolanaRpcApi,
  10. SolanaRpcSubscriptionsApi,
  11. TransactionSigner,
  12. airdropFactory,
  13. appendTransactionMessageInstruction,
  14. createSolanaRpc,
  15. createSolanaRpcSubscriptions,
  16. createTransactionMessage,
  17. generateKeyPairSigner,
  18. getSignatureFromTransaction,
  19. lamports,
  20. pipe,
  21. sendAndConfirmTransactionFactory,
  22. setTransactionMessageFeePayerSigner,
  23. setTransactionMessageLifetimeUsingBlockhash,
  24. signTransactionMessageWithSigners,
  25. } from '@solana/web3.js';
  26. import { findCounterPda, getCreateInstructionAsync } from '../src/index.js';
  27. type Client = {
  28. rpc: Rpc<SolanaRpcApi>;
  29. rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;
  30. };
  31. export const createDefaultSolanaClient = (): Client => {
  32. const rpc = createSolanaRpc('http://127.0.0.1:8899');
  33. const rpcSubscriptions = createSolanaRpcSubscriptions('ws://127.0.0.1:8900');
  34. return { rpc, rpcSubscriptions };
  35. };
  36. export const generateKeyPairSignerWithSol = async (
  37. client: Client,
  38. putativeLamports: bigint = 1_000_000_000n
  39. ) => {
  40. const signer = await generateKeyPairSigner();
  41. await airdropFactory(client)({
  42. recipientAddress: signer.address,
  43. lamports: lamports(putativeLamports),
  44. commitment: 'confirmed',
  45. });
  46. return signer;
  47. };
  48. export const createDefaultTransaction = async (
  49. client: Client,
  50. feePayer: TransactionSigner
  51. ) => {
  52. const { value: latestBlockhash } = await client.rpc
  53. .getLatestBlockhash()
  54. .send();
  55. return pipe(
  56. createTransactionMessage({ version: 0 }),
  57. (tx) => setTransactionMessageFeePayerSigner(feePayer, tx),
  58. (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx)
  59. );
  60. };
  61. export const signAndSendTransaction = async (
  62. client: Client,
  63. transactionMessage: CompilableTransactionMessage &
  64. TransactionMessageWithBlockhashLifetime,
  65. commitment: Commitment = 'confirmed'
  66. ) => {
  67. const signedTransaction =
  68. await signTransactionMessageWithSigners(transactionMessage);
  69. const signature = getSignatureFromTransaction(signedTransaction);
  70. await sendAndConfirmTransactionFactory(client)(signedTransaction, {
  71. commitment,
  72. });
  73. return signature;
  74. };
  75. export const getBalance = async (client: Client, address: Address) =>
  76. (await client.rpc.getBalance(address, { commitment: 'confirmed' }).send())
  77. .value;
  78. export const createCounterForAuthority = async (
  79. client: Client,
  80. authority: TransactionSigner
  81. ): Promise<ProgramDerivedAddress> => {
  82. const [transaction, counterPda, createIx] = await Promise.all([
  83. createDefaultTransaction(client, authority),
  84. findCounterPda({ authority: authority.address }),
  85. getCreateInstructionAsync({ authority }),
  86. ]);
  87. await pipe(
  88. transaction,
  89. (tx) => appendTransactionMessageInstruction(createIx, tx),
  90. (tx) => signAndSendTransaction(client, tx)
  91. );
  92. return counterPda;
  93. };