_setup.ts 2.2 KB

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