_setup.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import {
  2. Address,
  3. Commitment,
  4. CompilableTransaction,
  5. ITransactionWithBlockhashLifetime,
  6. Rpc,
  7. RpcSubscriptions,
  8. SolanaRpcApi,
  9. SolanaRpcSubscriptionsApi,
  10. TransactionSigner,
  11. airdropFactory,
  12. createSolanaRpc,
  13. createSolanaRpcSubscriptions,
  14. createTransaction,
  15. generateKeyPairSigner,
  16. getSignatureFromTransaction,
  17. lamports,
  18. pipe,
  19. sendAndConfirmTransactionFactory,
  20. setTransactionFeePayerSigner,
  21. setTransactionLifetimeUsingBlockhash,
  22. signTransactionWithSigners,
  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. createTransaction({ version: 0 }),
  54. (tx) => setTransactionFeePayerSigner(feePayer, tx),
  55. (tx) => setTransactionLifetimeUsingBlockhash(latestBlockhash, tx)
  56. );
  57. };
  58. export const signAndSendTransaction = async (
  59. client: Client,
  60. transaction: CompilableTransaction & ITransactionWithBlockhashLifetime,
  61. commitment: Commitment = 'confirmed'
  62. ) => {
  63. const signedTransaction = await signTransactionWithSigners(transaction);
  64. const signature = getSignatureFromTransaction(signedTransaction);
  65. await sendAndConfirmTransactionFactory(client)(signedTransaction, {
  66. commitment,
  67. });
  68. return signature;
  69. };
  70. export const getBalance = async (client: Client, address: Address) =>
  71. (await client.rpc.getBalance(address, { commitment: 'confirmed' }).send())
  72. .value;