@nosana/kit 2.0.19 → 2.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +96 -24
  2. package/dist/NosanaClient.d.ts +5 -5
  3. package/dist/NosanaClient.js +6 -5
  4. package/dist/NosanaClient.js.map +1 -1
  5. package/dist/index.d.ts +9 -9
  6. package/dist/index.js +5 -5
  7. package/dist/index.js.map +1 -1
  8. package/dist/services/programs/{JobsProgram.d.ts → jobs/JobsProgram.d.ts} +47 -11
  9. package/dist/services/programs/{JobsProgram.js → jobs/JobsProgram.js} +84 -208
  10. package/dist/services/programs/jobs/JobsProgram.js.map +1 -0
  11. package/dist/services/programs/jobs/index.d.ts +1 -0
  12. package/dist/services/programs/jobs/index.js +2 -0
  13. package/dist/services/programs/jobs/index.js.map +1 -0
  14. package/dist/services/programs/{instructions → jobs/instructions}/delist.d.ts +1 -1
  15. package/dist/services/programs/jobs/instructions/delist.js.map +1 -0
  16. package/dist/services/programs/{instructions → jobs/instructions}/end.d.ts +1 -1
  17. package/dist/services/programs/jobs/instructions/end.js.map +1 -0
  18. package/dist/services/programs/{instructions → jobs/instructions}/extend.d.ts +1 -1
  19. package/dist/services/programs/jobs/instructions/extend.js.map +1 -0
  20. package/dist/services/programs/jobs/instructions/index.js.map +1 -0
  21. package/dist/services/programs/{instructions → jobs/instructions}/post.d.ts +1 -1
  22. package/dist/services/programs/jobs/instructions/post.js.map +1 -0
  23. package/dist/services/programs/jobs/instructions/types.d.ts +16 -0
  24. package/dist/services/programs/jobs/instructions/types.js.map +1 -0
  25. package/dist/services/programs/jobs/monitor/index.d.ts +3 -0
  26. package/dist/services/programs/jobs/monitor/index.js +3 -0
  27. package/dist/services/programs/jobs/monitor/index.js.map +1 -0
  28. package/dist/services/programs/jobs/monitor/monitor.d.ts +22 -0
  29. package/dist/services/programs/jobs/monitor/monitor.js +180 -0
  30. package/dist/services/programs/jobs/monitor/monitor.js.map +1 -0
  31. package/dist/services/programs/jobs/monitor/types.d.ts +27 -0
  32. package/dist/services/programs/jobs/monitor/types.js +9 -0
  33. package/dist/services/programs/jobs/monitor/types.js.map +1 -0
  34. package/dist/services/programs/{MerkleDistributorProgram.d.ts → merkleDistributor/MerkleDistributorProgram.d.ts} +4 -4
  35. package/dist/services/programs/{MerkleDistributorProgram.js → merkleDistributor/MerkleDistributorProgram.js} +3 -3
  36. package/dist/services/programs/merkleDistributor/MerkleDistributorProgram.js.map +1 -0
  37. package/dist/services/programs/merkleDistributor/index.d.ts +1 -0
  38. package/dist/services/programs/merkleDistributor/index.js +2 -0
  39. package/dist/services/programs/merkleDistributor/index.js.map +1 -0
  40. package/dist/services/programs/{StakeProgram.d.ts → stake/StakeProgram.d.ts} +4 -4
  41. package/dist/services/programs/{StakeProgram.js → stake/StakeProgram.js} +2 -2
  42. package/dist/services/programs/stake/StakeProgram.js.map +1 -0
  43. package/dist/services/programs/stake/index.d.ts +1 -0
  44. package/dist/services/programs/stake/index.js +2 -0
  45. package/dist/services/programs/stake/index.js.map +1 -0
  46. package/dist/services/{SolanaService.d.ts → solana/SolanaService.d.ts} +20 -4
  47. package/dist/services/{SolanaService.js → solana/SolanaService.js} +43 -4
  48. package/dist/services/solana/SolanaService.js.map +1 -0
  49. package/dist/services/solana/index.d.ts +1 -0
  50. package/dist/services/solana/index.js +2 -0
  51. package/dist/services/solana/index.js.map +1 -0
  52. package/dist/services/token/TokenService.d.ts +63 -0
  53. package/dist/services/{TokenService.js → token/TokenService.js} +69 -2
  54. package/dist/services/token/TokenService.js.map +1 -0
  55. package/dist/services/token/index.d.ts +1 -0
  56. package/dist/services/token/index.js +2 -0
  57. package/dist/services/token/index.js.map +1 -0
  58. package/dist/types.d.ts +3 -1
  59. package/dist/utils/convertHttpToWebSocketUrl.d.ts +28 -0
  60. package/dist/utils/convertHttpToWebSocketUrl.js +37 -0
  61. package/dist/utils/convertHttpToWebSocketUrl.js.map +1 -0
  62. package/dist/utils/getStaticAccounts.d.ts +1 -1
  63. package/dist/utils/index.d.ts +1 -0
  64. package/dist/utils/index.js +1 -0
  65. package/dist/utils/index.js.map +1 -1
  66. package/package.json +4 -4
  67. package/dist/services/SolanaService.js.map +0 -1
  68. package/dist/services/TokenService.d.ts +0 -41
  69. package/dist/services/TokenService.js.map +0 -1
  70. package/dist/services/programs/JobsProgram.js.map +0 -1
  71. package/dist/services/programs/MerkleDistributorProgram.js.map +0 -1
  72. package/dist/services/programs/StakeProgram.js.map +0 -1
  73. package/dist/services/programs/instructions/delist.js.map +0 -1
  74. package/dist/services/programs/instructions/end.js.map +0 -1
  75. package/dist/services/programs/instructions/extend.js.map +0 -1
  76. package/dist/services/programs/instructions/index.js.map +0 -1
  77. package/dist/services/programs/instructions/post.js.map +0 -1
  78. package/dist/services/programs/instructions/types.d.ts +0 -16
  79. package/dist/services/programs/instructions/types.js.map +0 -1
  80. /package/dist/services/programs/{instructions → jobs/instructions}/delist.js +0 -0
  81. /package/dist/services/programs/{instructions → jobs/instructions}/end.js +0 -0
  82. /package/dist/services/programs/{instructions → jobs/instructions}/extend.js +0 -0
  83. /package/dist/services/programs/{instructions → jobs/instructions}/index.d.ts +0 -0
  84. /package/dist/services/programs/{instructions → jobs/instructions}/index.js +0 -0
  85. /package/dist/services/programs/{instructions → jobs/instructions}/post.js +0 -0
  86. /package/dist/services/programs/{instructions → jobs/instructions}/types.js +0 -0
@@ -0,0 +1,180 @@
1
+ import { parseBase64RpcAccount } from '@solana/kit';
2
+ import { JobState } from '../JobsProgram.js';
3
+ import { MonitorEventType } from './types.js';
4
+ /**
5
+ * Set up WebSocket subscription for program notifications
6
+ */
7
+ async function setupSubscription(deps, programId, abortController) {
8
+ try {
9
+ // Set up the subscription using the correct API pattern
10
+ const subscriptionIterable = await deps.solana.rpcSubscriptions
11
+ .programNotifications(programId, { encoding: 'base64' })
12
+ .subscribe({ abortSignal: abortController.signal });
13
+ return subscriptionIterable;
14
+ }
15
+ catch (error) {
16
+ throw new Error(`Failed to setup subscription: ${error}`);
17
+ }
18
+ }
19
+ /**
20
+ * Handle JobAccount updates
21
+ */
22
+ async function handleJobAccount(encodedAccount, autoMerge, runs, monitorDeps) {
23
+ const { client, transformJobAccount, mergeRunIntoJob, deps } = monitorDeps;
24
+ const jobAccount = client.decodeJobAccount(encodedAccount);
25
+ let job = transformJobAccount(jobAccount);
26
+ // If auto-merge is enabled, check for run accounts
27
+ if (autoMerge && job.state === JobState.QUEUED) {
28
+ try {
29
+ const runAccounts = await runs({ job: job.address });
30
+ if (runAccounts.length > 0) {
31
+ job = mergeRunIntoJob(job, runAccounts[0]);
32
+ }
33
+ }
34
+ catch (error) {
35
+ deps.logger.error(`Error checking run account for job ${job.address}: ${error}`);
36
+ }
37
+ }
38
+ return { type: MonitorEventType.JOB, data: job };
39
+ }
40
+ /**
41
+ * Handle MarketAccount updates
42
+ */
43
+ function handleMarketAccount(encodedAccount, monitorDeps) {
44
+ const { client, transformMarketAccount } = monitorDeps;
45
+ const marketAccount = client.decodeMarketAccount(encodedAccount);
46
+ const market = transformMarketAccount(marketAccount);
47
+ return { type: MonitorEventType.MARKET, data: market };
48
+ }
49
+ /**
50
+ * Handle RunAccount updates
51
+ */
52
+ async function handleRunAccount(encodedAccount, autoMerge, get, monitorDeps) {
53
+ const { client, transformRunAccount, mergeRunIntoJob, deps } = monitorDeps;
54
+ const runAccount = client.decodeRunAccount(encodedAccount);
55
+ const run = transformRunAccount(runAccount);
56
+ if (autoMerge) {
57
+ // For auto-merge, fetch the job and merge run data, then yield as job event
58
+ try {
59
+ const job = await get(run.job, false);
60
+ const mergedJob = mergeRunIntoJob(job, run);
61
+ return { type: MonitorEventType.JOB, data: mergedJob };
62
+ }
63
+ catch (error) {
64
+ deps.logger.error(`Error fetching job ${run.job} for run account ${runAccount.address}: ${error}`);
65
+ // Skip this event if we can't fetch the job
66
+ return null;
67
+ }
68
+ }
69
+ else {
70
+ // For detailed monitoring, yield run event as-is
71
+ return { type: MonitorEventType.RUN, data: run };
72
+ }
73
+ }
74
+ /**
75
+ * Create an async generator that yields monitor events from subscription notifications
76
+ */
77
+ async function* createEventStream(subscriptionIterable, isMonitoring, autoMerge, get, runs, monitorDeps) {
78
+ const { deps, client } = monitorDeps;
79
+ try {
80
+ for await (const notification of subscriptionIterable) {
81
+ // Check if monitoring should continue
82
+ if (!isMonitoring()) {
83
+ deps.logger.info('Monitoring stopped, exiting subscription processing');
84
+ break;
85
+ }
86
+ try {
87
+ const { value } = notification;
88
+ const { account, pubkey } = value;
89
+ const encodedAccount = parseBase64RpcAccount(pubkey, account);
90
+ const accountType = client.identifyNosanaJobsAccount(encodedAccount);
91
+ let event = null;
92
+ switch (accountType) {
93
+ case client.NosanaJobsAccount.JobAccount:
94
+ event = await handleJobAccount(encodedAccount, autoMerge, runs, monitorDeps);
95
+ break;
96
+ case client.NosanaJobsAccount.MarketAccount:
97
+ event = handleMarketAccount(encodedAccount, monitorDeps);
98
+ break;
99
+ case client.NosanaJobsAccount.RunAccount:
100
+ event = await handleRunAccount(encodedAccount, autoMerge, get, monitorDeps);
101
+ break;
102
+ default:
103
+ deps.logger.error(`No support yet for account type: ${accountType}`);
104
+ break;
105
+ }
106
+ if (event) {
107
+ yield event;
108
+ }
109
+ }
110
+ catch (error) {
111
+ deps.logger.error(`Error handling account update notification: ${error}`);
112
+ // Continue processing other events
113
+ }
114
+ }
115
+ }
116
+ catch (error) {
117
+ deps.logger.error(`Subscription error: ${error}`);
118
+ // Throw the error so the calling function can restart the subscription
119
+ throw error;
120
+ }
121
+ }
122
+ async function createMonitorStream(get, runs, autoMerge, monitorDeps) {
123
+ const { deps, config } = monitorDeps;
124
+ const programId = config.jobsAddress;
125
+ let abortController = null;
126
+ let isMonitoring = true;
127
+ // Function to stop all monitoring
128
+ const stopMonitoring = () => {
129
+ isMonitoring = false;
130
+ if (abortController) {
131
+ abortController.abort();
132
+ }
133
+ deps.logger.info(`Stopped monitoring job program account updates`);
134
+ };
135
+ // Create async generator that handles reconnection
136
+ const eventStream = (async function* () {
137
+ while (isMonitoring) {
138
+ try {
139
+ deps.logger.info('Attempting to establish WebSocket subscription...');
140
+ abortController = new AbortController();
141
+ const subscriptionIterable = await setupSubscription(deps, programId, abortController);
142
+ deps.logger.info('Successfully established WebSocket subscription');
143
+ // Yield events from the subscription
144
+ yield* createEventStream(subscriptionIterable, () => isMonitoring, autoMerge, get, runs, monitorDeps);
145
+ }
146
+ catch (error) {
147
+ if (!isMonitoring) {
148
+ // Monitoring was stopped, exit gracefully
149
+ return;
150
+ }
151
+ deps.logger.warn(`WebSocket subscription failed: ${error}`);
152
+ // Clean up current subscription
153
+ if (abortController) {
154
+ abortController.abort();
155
+ abortController = null;
156
+ }
157
+ if (isMonitoring) {
158
+ deps.logger.info('Retrying WebSocket subscription in 5 seconds...');
159
+ await new Promise((resolve) => setTimeout(resolve, 5000));
160
+ }
161
+ }
162
+ }
163
+ })();
164
+ deps.logger.info(`Successfully started monitoring job program account updates`);
165
+ return [eventStream, stopMonitoring];
166
+ }
167
+ /**
168
+ * Factory function to create monitor functions
169
+ */
170
+ export function createMonitorFunctions(get, runs, monitorDeps) {
171
+ return {
172
+ async monitor() {
173
+ return createMonitorStream(get, runs, true, monitorDeps);
174
+ },
175
+ async monitorDetailed() {
176
+ return createMonitorStream(get, runs, false, monitorDeps);
177
+ },
178
+ };
179
+ }
180
+ //# sourceMappingURL=monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../../../../src/services/programs/jobs/monitor/monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Job, Market, Run } from '../JobsProgram.js';
2
+ /**
3
+ * Monitor event type constants
4
+ */
5
+ export declare const MonitorEventType: {
6
+ readonly JOB: "job";
7
+ readonly MARKET: "market";
8
+ readonly RUN: "run";
9
+ };
10
+ export type MonitorEventType = (typeof MonitorEventType)[keyof typeof MonitorEventType];
11
+ /**
12
+ * Simple monitor event (run accounts are auto-merged into job events)
13
+ */
14
+ export type SimpleMonitorEvent = {
15
+ type: typeof MonitorEventType.JOB;
16
+ data: Job;
17
+ } | {
18
+ type: typeof MonitorEventType.MARKET;
19
+ data: Market;
20
+ };
21
+ /**
22
+ * Event types for monitoring (extends SimpleMonitorEvent with run events)
23
+ */
24
+ export type MonitorEvent = SimpleMonitorEvent | {
25
+ type: typeof MonitorEventType.RUN;
26
+ data: Run;
27
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Monitor event type constants
3
+ */
4
+ export const MonitorEventType = {
5
+ JOB: 'job',
6
+ MARKET: 'market',
7
+ RUN: 'run',
8
+ };
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../src/services/programs/jobs/monitor/types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACF,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { Address, ReadonlyUint8Array, TransactionSigner } from '@solana/kit';
2
- import type { ProgramDeps } from '../../types.js';
3
- import * as programClient from '../../generated_clients/merkle_distributor/index.js';
4
- import { ConvertTypesForDb } from '../../utils/index.js';
2
+ import type { ProgramDeps } from '../../../types.js';
3
+ import * as programClient from '../../../generated_clients/merkle_distributor/index.js';
4
+ import { ConvertTypesForDb } from '../../../utils/index.js';
5
5
  /**
6
6
  * Claim target enum for merkle distributor.
7
7
  * Determines which address receives the claimed tokens.
@@ -97,5 +97,5 @@ export interface MerkleDistributorProgram {
97
97
  * const distributor = await merkleDistributor.get('distributor-address');
98
98
  * ```
99
99
  */
100
- import type { ProgramConfig } from '../../config/types.js';
100
+ import type { ProgramConfig } from '../../../config/types.js';
101
101
  export declare function createMerkleDistributorProgram(deps: ProgramDeps, config: ProgramConfig): MerkleDistributorProgram;
@@ -1,7 +1,7 @@
1
1
  import { parseBase64RpcAccount, address, } from '@solana/kit';
2
- import { NosanaError, ErrorCodes } from '../../errors/NosanaError.js';
3
- import * as programClient from '../../generated_clients/merkle_distributor/index.js';
4
- import { convertBigIntToNumber } from '../../utils/index.js';
2
+ import { NosanaError, ErrorCodes } from '../../../errors/NosanaError.js';
3
+ import * as programClient from '../../../generated_clients/merkle_distributor/index.js';
4
+ import { convertBigIntToNumber } from '../../../utils/index.js';
5
5
  import { findAssociatedTokenPda, TOKEN_PROGRAM_ADDRESS } from '@solana-program/token';
6
6
  import { SYSTEM_PROGRAM_ADDRESS } from '@solana-program/system';
7
7
  import bs58 from 'bs58';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MerkleDistributorProgram.js","sourceRoot":"","sources":["../../../../src/services/programs/merkleDistributor/MerkleDistributorProgram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './MerkleDistributorProgram.js';
@@ -0,0 +1,2 @@
1
+ export * from './MerkleDistributorProgram.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/programs/merkleDistributor/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { Address } from '@solana/kit';
2
- import type { ProgramDeps } from '../../types.js';
3
- import * as programClient from '../../generated_clients/staking/index.js';
4
- import { ConvertTypesForDb } from '../../utils/index.js';
2
+ import type { ProgramDeps } from '../../../types.js';
3
+ import * as programClient from '../../../generated_clients/staking/index.js';
4
+ import { ConvertTypesForDb } from '../../../utils/index.js';
5
5
  export type Stake = ConvertTypesForDb<programClient.StakeAccountArgs> & {
6
6
  address: Address;
7
7
  };
@@ -42,5 +42,5 @@ export interface StakeProgram {
42
42
  * const stake = await stakeProgram.get('stake-address');
43
43
  * ```
44
44
  */
45
- import type { ProgramConfig } from '../../config/types.js';
45
+ import type { ProgramConfig } from '../../../config/types.js';
46
46
  export declare function createStakeProgram(deps: ProgramDeps, config: ProgramConfig): StakeProgram;
@@ -1,6 +1,6 @@
1
1
  import { parseBase64RpcAccount } from '@solana/kit';
2
- import * as programClient from '../../generated_clients/staking/index.js';
3
- import { convertBigIntToNumber } from '../../utils/index.js';
2
+ import * as programClient from '../../../generated_clients/staking/index.js';
3
+ import { convertBigIntToNumber } from '../../../utils/index.js';
4
4
  import bs58 from 'bs58';
5
5
  export function createStakeProgram(deps, config) {
6
6
  const programId = config.stakeAddress;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StakeProgram.js","sourceRoot":"","sources":["../../../../src/services/programs/stake/StakeProgram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './StakeProgram.js';
@@ -0,0 +1,2 @@
1
+ export * from './StakeProgram.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/programs/stake/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -1,8 +1,10 @@
1
1
  import { createSolanaRpc, createSolanaRpcSubscriptions, Address, Signature, Instruction, TransactionMessageWithBlockhashLifetime, sendAndConfirmTransactionFactory, TransactionMessageWithFeePayer, TransactionMessage, SendableTransaction, Transaction, BaseTransactionMessage, TransactionSigner, TransactionWithBlockhashLifetime } from '@solana/kit';
2
2
  import { estimateComputeUnitLimitFactory } from '@solana-program/compute-budget';
3
- import { Logger } from '../logger/Logger.js';
4
- import { Wallet } from '../types.js';
5
- import { SolanaConfig } from '../config/types.js';
3
+ import { getCreateAssociatedTokenIdempotentInstructionAsync } from '@solana-program/token';
4
+ import { getTransferSolInstruction } from '@solana-program/system';
5
+ import { Logger } from '../../logger/Logger.js';
6
+ import { Wallet } from '../../types.js';
7
+ import { SolanaConfig } from '../../config/types.js';
6
8
  /**
7
9
  * Factory function to create an estimateAndSetComputeUnitLimit function
8
10
  * that estimates compute units and adds the set compute unit limit instruction
@@ -44,6 +46,20 @@ export interface SolanaService {
44
46
  feePayer?: TransactionSigner;
45
47
  commitment?: 'processed' | 'confirmed' | 'finalized';
46
48
  }): Promise<Signature>;
49
+ /**
50
+ * Get an instruction to transfer SOL from one address to another.
51
+ *
52
+ * @param params Transfer parameters
53
+ * @param params.to Recipient address
54
+ * @param params.amount Amount in lamports (number or bigint)
55
+ * @param params.from Optional sender TransactionSigner. If not provided, uses wallet from client.
56
+ * @returns An instruction to transfer SOL
57
+ */
58
+ transfer(params: {
59
+ to: Address | string;
60
+ amount: number | bigint;
61
+ from?: TransactionSigner;
62
+ }): Promise<ReturnType<typeof getTransferSolInstruction>>;
47
63
  /**
48
64
  * Get an instruction to create an associated token account if it doesn't exist.
49
65
  * Checks if the ATA exists, and if not, returns an instruction to create it.
@@ -55,7 +71,7 @@ export interface SolanaService {
55
71
  * @param payer Optional payer for the account creation. If not provided, uses the wallet or service feePayer.
56
72
  * @returns An instruction to create the ATA if it doesn't exist, or null if it already exists
57
73
  */
58
- getCreateATAInstructionIfNeeded(ata: Address, mint: Address, owner: Address, payer?: TransactionSigner): Promise<Instruction | null>;
74
+ getCreateATAInstructionIfNeeded(ata: Address, mint: Address, owner: Address, payer?: TransactionSigner): Promise<Awaited<ReturnType<typeof getCreateAssociatedTokenIdempotentInstructionAsync>> | null>;
59
75
  }
60
76
  /**
61
77
  * Creates a Solana service instance.
@@ -1,8 +1,9 @@
1
1
  import { createSolanaRpc, createSolanaRpcSubscriptions, address, getProgramDerivedAddress, getAddressEncoder, createTransactionMessage, signTransactionMessageWithSigners, getSignatureFromTransaction, setTransactionMessageFeePayerSigner, setTransactionMessageLifetimeUsingBlockhash, sendAndConfirmTransactionFactory, appendTransactionMessageInstructions, pipe, assertIsSendableTransaction, } from '@solana/kit';
2
2
  import { estimateComputeUnitLimitFactory, getSetComputeUnitLimitInstruction, } from '@solana-program/compute-budget';
3
3
  import { getCreateAssociatedTokenIdempotentInstructionAsync, TOKEN_PROGRAM_ADDRESS, } from '@solana-program/token';
4
- import { SYSTEM_PROGRAM_ADDRESS } from '@solana-program/system';
5
- import { NosanaError, ErrorCodes } from '../errors/NosanaError.js';
4
+ import { SYSTEM_PROGRAM_ADDRESS, getTransferSolInstruction } from '@solana-program/system';
5
+ import { NosanaError, ErrorCodes } from '../../errors/NosanaError.js';
6
+ import { convertHttpToWebSocketUrl } from '../../utils/convertHttpToWebSocketUrl.js';
6
7
  /**
7
8
  * Factory function to create an estimateAndSetComputeUnitLimit function
8
9
  * that estimates compute units and adds the set compute unit limit instruction
@@ -22,8 +23,9 @@ export function createSolanaService(deps, config) {
22
23
  throw new NosanaError('RPC URL is required', ErrorCodes.INVALID_CONFIG);
23
24
  }
24
25
  const rpc = createSolanaRpc(config.rpcEndpoint);
25
- // Use wsEndpoint if provided, otherwise fall back to rpcEndpoint
26
- const rpcSubscriptions = createSolanaRpcSubscriptions(config.wsEndpoint ?? config.rpcEndpoint);
26
+ // Use wsEndpoint if provided, otherwise convert rpcEndpoint from http(s) to ws(s)
27
+ const wsUrl = config.wsEndpoint ?? convertHttpToWebSocketUrl(config.rpcEndpoint);
28
+ const rpcSubscriptions = createSolanaRpcSubscriptions(wsUrl);
27
29
  const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({
28
30
  rpc,
29
31
  rpcSubscriptions,
@@ -199,6 +201,43 @@ export function createSolanaService(deps, config) {
199
201
  const signedTransaction = await this.signTransaction(transactionMessage);
200
202
  return await this.sendTransaction(signedTransaction, { commitment: options?.commitment });
201
203
  },
204
+ /**
205
+ * Get an instruction to transfer SOL from one address to another.
206
+ *
207
+ * @param params Transfer parameters
208
+ * @param params.to Recipient address
209
+ * @param params.amount Amount in lamports (number or bigint)
210
+ * @param params.from Optional sender TransactionSigner. If not provided, uses wallet from client.
211
+ * @returns An instruction to transfer SOL
212
+ */
213
+ async transfer(params) {
214
+ try {
215
+ // Determine sender: use params.from if provided, otherwise get from wallet
216
+ const sender = params.from ?? deps.getWallet();
217
+ if (!sender) {
218
+ throw new NosanaError('No wallet found and no from parameter provided', ErrorCodes.NO_WALLET);
219
+ }
220
+ // Convert amount to bigint if it's a number
221
+ const amountBigInt = typeof params.amount === 'bigint' ? params.amount : BigInt(params.amount);
222
+ // Convert recipient to Address
223
+ const recipient = typeof params.to === 'string' ? address(params.to) : params.to;
224
+ deps.logger.debug(`Creating SOL transfer instruction: ${amountBigInt} lamports from ${sender.address} to ${recipient}`);
225
+ // Create and return transfer instruction
226
+ const instruction = getTransferSolInstruction({
227
+ source: sender,
228
+ destination: recipient,
229
+ amount: amountBigInt,
230
+ });
231
+ return instruction;
232
+ }
233
+ catch (error) {
234
+ if (error instanceof NosanaError) {
235
+ throw error;
236
+ }
237
+ deps.logger.error(`Failed to get transfer SOL instruction: ${error}`);
238
+ throw new NosanaError('Failed to get transfer SOL instruction', ErrorCodes.TRANSACTION_ERROR, error);
239
+ }
240
+ },
202
241
  /**
203
242
  * Get an instruction to create an associated token account if it doesn't exist.
204
243
  * Checks if the ATA exists, and if not, returns an instruction to create it.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SolanaService.js","sourceRoot":"","sources":["../../../src/services/solana/SolanaService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,OAAO,EAEP,wBAAwB,EACxB,iBAAiB,EACjB,wBAAwB,EACxB,iCAAiC,EACjC,2BAA2B,EAI3B,mCAAmC,EACnC,2CAA2C,EAC3C,gCAAgC,EAKhC,oCAAoC,EAEpC,IAAI,EACJ,2BAA2B,GAI5B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,+BAA+B,EAC/B,iCAAiC,GAClC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,kDAAkD,EAClD,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAItE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AAErF;;;GAGG;AACH,SAAS,qCAAqC,CAC5C,GAAG,MAA0D;IAE7D,MAAM,wBAAwB,GAAG,+BAA+B,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5E,OAAO,KAAK,EACV,kBAAqB,EACrB,EAAE;QACF,MAAM,oBAAoB,GAAG,MAAM,wBAAwB,CAAC,kBAAkB,CAAC,CAAC;QAChF,OAAO,oCAAoC,CACzC,CAAC,iCAAiC,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC,EACpE,kBAAkB,CACnB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAiFD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAuB,EAAE,MAAoB;IAC/E,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAChD,kFAAkF;IAClF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,IAAI,yBAAyB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACjF,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,yBAAyB,GAAG,gCAAgC,CAAC;QACjE,GAAG;QACH,gBAAgB;KACjB,CAAC,CAAC;IAEH,+DAA+D;IAC/D,MAAM,8BAA8B,GAAG,qCAAqC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAEtF,gEAAgE;IAChE,IAAI,QAAQ,GAAkC,MAAM,CAAC,QAAQ,CAAC;IAE9D,OAAO;QACL,MAAM;QACN,GAAG;QACH,gBAAgB;QAChB,yBAAyB;QACzB,8BAA8B;QAC9B,IAAI,QAAQ;YACV,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,QAAQ,CAAC,KAAoC;YAC/C,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,KAA8B,EAAE,SAAkB;YAC1D,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,wBAAwB,CAAC;gBAC3C,cAAc,EAAE,SAAS;gBACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBACxB,mEAAmE;oBACnE,yDAAyD;oBACzD,wFAAwF;oBACxF,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC7B,6EAA6E;wBAC7E,0DAA0D;wBAC1D,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;4BAC3C,IAAI,CAAC;gCACH,qEAAqE;gCACrE,OAAO,cAAc,CAAC,MAAM,CAAC,IAAe,CAAC,CAAC;4BAChD,CAAC;4BAAC,MAAM,CAAC;gCACP,gFAAgF;gCAChF,OAAO,IAAI,CAAC;4BACd,CAAC;wBACH,CAAC;wBACD,2BAA2B;wBAC3B,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,qCAAqC;oBACrC,OAAO,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC,CAAC;aACH,CAAC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,UAA6B;YAC5C,IAAI,CAAC;gBACH,+CAA+C;gBAC/C,IAAI,IAAa,CAAC;gBAClB,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,MAAM,IAAI,WAAW,CAAC,yCAAyC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;oBACzF,CAAC;oBACD,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;gBACxB,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;gBAC1D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClD,OAAO,OAAO,CAAC,KAAK,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;oBACjC,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;gBACrD,MAAM,IAAI,WAAW,CAAC,uBAAuB,EAAE,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED;;;;;;;;;;;;WAYG;QACH,KAAK,CAAC,gBAAgB,CACpB,YAAyC,EACzC,OAA0C;YAI1C,yDAAyD;YACzD,MAAM,mBAAmB,GAAG,OAAO,EAAE,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9E,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,MAAM,IAAI,WAAW,CAAC,0CAA0C,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;YAC1F,CAAC;YAED,IAAI,CAAC;gBACH,uBAAuB;gBACvB,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,MAAM,GAAG,CAAC,kBAAkB,EAAE,CAAC,IAAI,EAAE,CAAC;gBAEzE,kCAAkC;gBAClC,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAEtF,uCAAuC;gBACvC,MAAM,kBAAkB,GAAG,MAAM,IAAI,CACnC,wBAAwB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EACxC,CAAC,EAAE,EAAE,EAAE,CAAC,mCAAmC,CAAC,mBAAmB,EAAE,EAAE,CAAC,EACpE,CAAC,EAAE,EAAE,EAAE,CAAC,2CAA2C,CAAC,eAAe,EAAE,EAAE,CAAC,EACxE,CAAC,EAAE,EAAE,EAAE,CAAC,oCAAoC,CAAC,iBAAiB,EAAE,EAAE,CAAC,EACnE,CAAC,EAAE,EAAE,EAAE,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAC3C,CAAC;gBAEF,OAAO,kBAAkB,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;gBAC3D,MAAM,IAAI,WAAW,CAAC,6BAA6B,EAAE,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QAED;;;;;;;WAOG;QACH,KAAK,CAAC,eAAe,CACnB,kBAEyC;YAEzC,IAAI,CAAC;gBACH,qEAAqE;gBACrE,MAAM,WAAW,GAAG,MAAM,iCAAiC,CAAC,kBAAkB,CAAC,CAAC;gBAEhF,OAAO,WAAmF,CAAC;YAC7F,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;gBAC1D,MAAM,IAAI,WAAW,CAAC,4BAA4B,EAAE,UAAU,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QAED;;;;;;;;WAQG;QACH,KAAK,CAAC,eAAe,CACnB,WAAiF,EACjF,OAAqC;YAErC,IAAI,CAAC;gBACH,+DAA+D;gBAC/D,2BAA2B,CAAC,WAAW,CAAC,CAAC;gBAEzC,4CAA4C;gBAC5C,MAAM,SAAS,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;gBAE3D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;gBAEtD,kEAAkE;gBAClE,iEAAiE;gBACjE,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC;gBAC3E,MAAM,yBAAyB,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;gBAE7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,SAAS,aAAa,CAAC,CAAC;gBAExD,OAAO,SAAS,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7G,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAChC,MAAM,IAAI,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED;;;;;;;;;;WAUG;QACH,KAAK,CAAC,gBAAgB,CACpB,YAAyC,EACzC,OAGC;YAED,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE;gBACnE,QAAQ,EAAE,OAAO,EAAE,QAAQ;aAC5B,CAAC,CAAC;YACH,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;YACzE,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED;;;;;;;;WAQG;QACH,KAAK,CAAC,QAAQ,CAAC,MAId;YACC,IAAI,CAAC;gBACH,2EAA2E;gBAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,WAAW,CACnB,gDAAgD,EAChD,UAAU,CAAC,SAAS,CACrB,CAAC;gBACJ,CAAC;gBAED,4CAA4C;gBAC5C,MAAM,YAAY,GAChB,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAE5E,+BAA+B;gBAC/B,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBAEjF,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,sCAAsC,YAAY,kBAAkB,MAAM,CAAC,OAAO,OAAO,SAAS,EAAE,CACrG,CAAC;gBAEF,yCAAyC;gBACzC,MAAM,WAAW,GAAG,yBAAyB,CAAC;oBAC5C,MAAM,EAAE,MAAM;oBACd,WAAW,EAAE,SAAS;oBACtB,MAAM,EAAE,YAAY;iBACrB,CAAC,CAAC;gBAEH,OAAO,WAAW,CAAC;YACrB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;oBACjC,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC;gBACtE,MAAM,IAAI,WAAW,CACnB,wCAAwC,EACxC,UAAU,CAAC,iBAAiB,EAC5B,KAAK,CACN,CAAC;YACJ,CAAC;QACH,CAAC;QAED;;;;;;;;;;WAUG;QACH,KAAK,CAAC,+BAA+B,CACnC,GAAY,EACZ,IAAa,EACb,KAAc,EACd,KAAyB;YAIzB,IAAI,CAAC;gBACH,8BAA8B;gBAC9B,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzD,IAAI,WAAW,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;oBAC/B,yBAAyB;oBACzB,OAAO,IAAI,CAAC;gBACd,CAAC;gBAED,4CAA4C;gBAC5C,uDAAuD;gBACvD,MAAM,gBAAgB,GAAG,KAAK,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC/D,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,MAAM,IAAI,WAAW,CACnB,sDAAsD,EACtD,UAAU,CAAC,SAAS,CACrB,CAAC;gBACJ,CAAC;gBAED,MAAM,WAAW,GAAG,MAAM,kDAAkD,CAAC;oBAC3E,KAAK,EAAE,gBAAgB;oBACvB,GAAG;oBACH,KAAK;oBACL,IAAI;oBACJ,aAAa,EAAE,sBAAsB;oBACrC,YAAY,EAAE,qBAAqB;iBACpC,CAAC,CAAC;gBAEH,OAAO,WAAW,CAAC;YACrB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;gBACpE,MAAM,IAAI,WAAW,CAAC,sCAAsC,EAAE,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './SolanaService.js';
@@ -0,0 +1,2 @@
1
+ export * from './SolanaService.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/solana/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { Address, Instruction, TransactionSigner } from '@solana/kit';
2
+ import { Logger } from '../../logger/Logger.js';
3
+ export interface TokenAccount {
4
+ pubkey: Address;
5
+ owner: Address;
6
+ mint: Address;
7
+ amount: bigint;
8
+ decimals: number;
9
+ }
10
+ export interface TokenAccountWithBalance extends TokenAccount {
11
+ uiAmount: number;
12
+ }
13
+ import type { SolanaService } from '../solana/index.js';
14
+ /**
15
+ * Dependencies for TokenService
16
+ */
17
+ export interface TokenServiceDeps {
18
+ logger: Logger;
19
+ solana: SolanaService;
20
+ }
21
+ /**
22
+ * Config for TokenService
23
+ */
24
+ export interface TokenServiceConfig {
25
+ tokenAddress: Address;
26
+ }
27
+ /**
28
+ * TokenService interface
29
+ */
30
+ export interface TokenService {
31
+ getAllTokenHolders(options?: {
32
+ includeZeroBalance?: boolean;
33
+ excludePdaAccounts?: boolean;
34
+ }): Promise<TokenAccountWithBalance[]>;
35
+ getTokenAccountForAddress(owner: string | Address): Promise<TokenAccountWithBalance | null>;
36
+ getBalance(owner: string | Address): Promise<number>;
37
+ /**
38
+ * Get the associated token account address for a given owner.
39
+ *
40
+ * @param owner The owner address
41
+ * @returns The associated token account address
42
+ */
43
+ getATA(owner: Address | string): Promise<Address>;
44
+ /**
45
+ * Get instruction(s) to transfer SPL tokens from one address to another.
46
+ * May return 1 or 2 instructions depending on whether the recipient's associated token account needs to be created.
47
+ *
48
+ * @param params Transfer parameters
49
+ * @param params.to Recipient address
50
+ * @param params.amount Amount in token base units (number or bigint)
51
+ * @param params.from Optional sender TransactionSigner. If not provided, uses wallet from client.
52
+ * @returns Array of instructions (create ATA instruction if needed, then transfer instruction)
53
+ */
54
+ transfer(params: {
55
+ to: Address | string;
56
+ amount: number | bigint;
57
+ from?: TransactionSigner;
58
+ }): Promise<Instruction[]>;
59
+ }
60
+ /**
61
+ * Creates a TokenService instance.
62
+ */
63
+ export declare function createTokenService(deps: TokenServiceDeps, config: TokenServiceConfig): TokenService;
@@ -1,6 +1,6 @@
1
1
  import { address } from '@solana/kit';
2
- import { NosanaError, ErrorCodes } from '../errors/NosanaError.js';
3
- import { TOKEN_PROGRAM_ADDRESS } from '@solana-program/token';
2
+ import { NosanaError, ErrorCodes } from '../../errors/NosanaError.js';
3
+ import { TOKEN_PROGRAM_ADDRESS, getTransferInstruction, findAssociatedTokenPda, } from '@solana-program/token';
4
4
  // Standard SPL token account size
5
5
  const TOKEN_ACCOUNT_SIZE = 165;
6
6
  // Offset of mint address in token account data structure
@@ -131,6 +131,73 @@ export function createTokenService(deps, config) {
131
131
  const account = await this.getTokenAccountForAddress(owner);
132
132
  return account ? account.uiAmount : 0;
133
133
  },
134
+ /**
135
+ * Get the associated token account address for a given owner.
136
+ *
137
+ * @param owner The owner address
138
+ * @returns The associated token account address
139
+ */
140
+ async getATA(owner) {
141
+ const ownerAddr = typeof owner === 'string' ? address(owner) : owner;
142
+ const tokenMint = config.tokenAddress;
143
+ const [ata] = await findAssociatedTokenPda({
144
+ mint: tokenMint,
145
+ owner: ownerAddr,
146
+ tokenProgram: TOKEN_PROGRAM_ADDRESS,
147
+ });
148
+ return ata;
149
+ },
150
+ /**
151
+ * Get instruction(s) to transfer SPL tokens from one address to another.
152
+ * May return 1 or 2 instructions depending on whether the recipient's associated token account needs to be created.
153
+ *
154
+ * @param params Transfer parameters
155
+ * @param params.to Recipient address
156
+ * @param params.amount Amount in token base units (number or bigint)
157
+ * @param params.from Optional sender TransactionSigner. If not provided, uses wallet from client.
158
+ * @returns Array of instructions (create ATA instruction if needed, then transfer instruction)
159
+ */
160
+ async transfer(params) {
161
+ try {
162
+ // Determine sender: use params.from if provided, otherwise use feePayer from solana service
163
+ // Note: feePayer is typically set to the wallet when the client wallet is set
164
+ const sender = params.from ?? deps.solana.feePayer;
165
+ if (!sender) {
166
+ throw new NosanaError('No wallet found and no from parameter provided', ErrorCodes.NO_WALLET);
167
+ }
168
+ // Convert amount to bigint if it's a number
169
+ const amountBigInt = typeof params.amount === 'bigint' ? params.amount : BigInt(params.amount);
170
+ // Convert recipient to Address
171
+ const recipient = typeof params.to === 'string' ? address(params.to) : params.to;
172
+ const tokenMint = config.tokenAddress;
173
+ deps.logger.debug(`Creating SPL token transfer instruction: ${amountBigInt} tokens from ${sender.address} to ${recipient}`);
174
+ // Find sender's ATA
175
+ const senderAta = await this.getATA(sender.address);
176
+ // Find recipient's ATA
177
+ const recipientAta = await this.getATA(recipient);
178
+ // Check if recipient ATA exists and get create instruction if needed
179
+ const createAtaInstruction = await deps.solana.getCreateATAInstructionIfNeeded(recipientAta, tokenMint, recipient, sender);
180
+ // Create transfer instruction
181
+ const transferIx = getTransferInstruction({
182
+ source: senderAta,
183
+ destination: recipientAta,
184
+ authority: sender.address,
185
+ amount: amountBigInt,
186
+ });
187
+ // Return array of instructions - either 1 or 2 instructions
188
+ if (createAtaInstruction) {
189
+ return [createAtaInstruction, transferIx];
190
+ }
191
+ return [transferIx];
192
+ }
193
+ catch (error) {
194
+ if (error instanceof NosanaError) {
195
+ throw error;
196
+ }
197
+ deps.logger.error(`Failed to get transfer instruction: ${error}`);
198
+ throw new NosanaError('Failed to get transfer instruction', ErrorCodes.TRANSACTION_ERROR, error);
199
+ }
200
+ },
134
201
  };
135
202
  }
136
203
  //# sourceMappingURL=TokenService.js.map