@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.
- package/README.md +96 -24
- package/dist/NosanaClient.d.ts +5 -5
- package/dist/NosanaClient.js +6 -5
- package/dist/NosanaClient.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/services/programs/{JobsProgram.d.ts → jobs/JobsProgram.d.ts} +47 -11
- package/dist/services/programs/{JobsProgram.js → jobs/JobsProgram.js} +84 -208
- package/dist/services/programs/jobs/JobsProgram.js.map +1 -0
- package/dist/services/programs/jobs/index.d.ts +1 -0
- package/dist/services/programs/jobs/index.js +2 -0
- package/dist/services/programs/jobs/index.js.map +1 -0
- package/dist/services/programs/{instructions → jobs/instructions}/delist.d.ts +1 -1
- package/dist/services/programs/jobs/instructions/delist.js.map +1 -0
- package/dist/services/programs/{instructions → jobs/instructions}/end.d.ts +1 -1
- package/dist/services/programs/jobs/instructions/end.js.map +1 -0
- package/dist/services/programs/{instructions → jobs/instructions}/extend.d.ts +1 -1
- package/dist/services/programs/jobs/instructions/extend.js.map +1 -0
- package/dist/services/programs/jobs/instructions/index.js.map +1 -0
- package/dist/services/programs/{instructions → jobs/instructions}/post.d.ts +1 -1
- package/dist/services/programs/jobs/instructions/post.js.map +1 -0
- package/dist/services/programs/jobs/instructions/types.d.ts +16 -0
- package/dist/services/programs/jobs/instructions/types.js.map +1 -0
- package/dist/services/programs/jobs/monitor/index.d.ts +3 -0
- package/dist/services/programs/jobs/monitor/index.js +3 -0
- package/dist/services/programs/jobs/monitor/index.js.map +1 -0
- package/dist/services/programs/jobs/monitor/monitor.d.ts +22 -0
- package/dist/services/programs/jobs/monitor/monitor.js +180 -0
- package/dist/services/programs/jobs/monitor/monitor.js.map +1 -0
- package/dist/services/programs/jobs/monitor/types.d.ts +27 -0
- package/dist/services/programs/jobs/monitor/types.js +9 -0
- package/dist/services/programs/jobs/monitor/types.js.map +1 -0
- package/dist/services/programs/{MerkleDistributorProgram.d.ts → merkleDistributor/MerkleDistributorProgram.d.ts} +4 -4
- package/dist/services/programs/{MerkleDistributorProgram.js → merkleDistributor/MerkleDistributorProgram.js} +3 -3
- package/dist/services/programs/merkleDistributor/MerkleDistributorProgram.js.map +1 -0
- package/dist/services/programs/merkleDistributor/index.d.ts +1 -0
- package/dist/services/programs/merkleDistributor/index.js +2 -0
- package/dist/services/programs/merkleDistributor/index.js.map +1 -0
- package/dist/services/programs/{StakeProgram.d.ts → stake/StakeProgram.d.ts} +4 -4
- package/dist/services/programs/{StakeProgram.js → stake/StakeProgram.js} +2 -2
- package/dist/services/programs/stake/StakeProgram.js.map +1 -0
- package/dist/services/programs/stake/index.d.ts +1 -0
- package/dist/services/programs/stake/index.js +2 -0
- package/dist/services/programs/stake/index.js.map +1 -0
- package/dist/services/{SolanaService.d.ts → solana/SolanaService.d.ts} +20 -4
- package/dist/services/{SolanaService.js → solana/SolanaService.js} +43 -4
- package/dist/services/solana/SolanaService.js.map +1 -0
- package/dist/services/solana/index.d.ts +1 -0
- package/dist/services/solana/index.js +2 -0
- package/dist/services/solana/index.js.map +1 -0
- package/dist/services/token/TokenService.d.ts +63 -0
- package/dist/services/{TokenService.js → token/TokenService.js} +69 -2
- package/dist/services/token/TokenService.js.map +1 -0
- package/dist/services/token/index.d.ts +1 -0
- package/dist/services/token/index.js +2 -0
- package/dist/services/token/index.js.map +1 -0
- package/dist/types.d.ts +3 -1
- package/dist/utils/convertHttpToWebSocketUrl.d.ts +28 -0
- package/dist/utils/convertHttpToWebSocketUrl.js +37 -0
- package/dist/utils/convertHttpToWebSocketUrl.js.map +1 -0
- package/dist/utils/getStaticAccounts.d.ts +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/services/SolanaService.js.map +0 -1
- package/dist/services/TokenService.d.ts +0 -41
- package/dist/services/TokenService.js.map +0 -1
- package/dist/services/programs/JobsProgram.js.map +0 -1
- package/dist/services/programs/MerkleDistributorProgram.js.map +0 -1
- package/dist/services/programs/StakeProgram.js.map +0 -1
- package/dist/services/programs/instructions/delist.js.map +0 -1
- package/dist/services/programs/instructions/end.js.map +0 -1
- package/dist/services/programs/instructions/extend.js.map +0 -1
- package/dist/services/programs/instructions/index.js.map +0 -1
- package/dist/services/programs/instructions/post.js.map +0 -1
- package/dist/services/programs/instructions/types.d.ts +0 -16
- package/dist/services/programs/instructions/types.js.map +0 -1
- /package/dist/services/programs/{instructions → jobs/instructions}/delist.js +0 -0
- /package/dist/services/programs/{instructions → jobs/instructions}/end.js +0 -0
- /package/dist/services/programs/{instructions → jobs/instructions}/extend.js +0 -0
- /package/dist/services/programs/{instructions → jobs/instructions}/index.d.ts +0 -0
- /package/dist/services/programs/{instructions → jobs/instructions}/index.js +0 -0
- /package/dist/services/programs/{instructions → jobs/instructions}/post.js +0 -0
- /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 @@
|
|
|
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 '
|
|
3
|
-
import * as programClient from '
|
|
4
|
-
import { ConvertTypesForDb } from '
|
|
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 '
|
|
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 '
|
|
3
|
-
import * as programClient from '
|
|
4
|
-
import { convertBigIntToNumber } from '
|
|
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 @@
|
|
|
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 '
|
|
3
|
-
import * as programClient from '
|
|
4
|
-
import { ConvertTypesForDb } from '
|
|
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 '
|
|
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 '
|
|
3
|
-
import { convertBigIntToNumber } from '
|
|
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 @@
|
|
|
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 {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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<
|
|
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 '
|
|
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
|
|
26
|
-
const
|
|
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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SolanaService.js';
|
|
@@ -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 '
|
|
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
|