@nosana/kit 1.0.10 → 2.0.9
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 +539 -152
- package/dist/NosanaClient.d.ts +58 -0
- package/dist/NosanaClient.js +103 -0
- package/dist/NosanaClient.js.map +1 -0
- package/dist/config/defaultConfigs.d.ts +2 -1
- package/dist/config/defaultConfigs.js +4 -4
- package/dist/config/defaultConfigs.js.map +1 -0
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.js +1 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +41 -33
- package/dist/config/types.js +14 -13
- package/dist/config/types.js.map +1 -0
- package/dist/config/utils.d.ts +2 -2
- package/dist/config/utils.js +11 -4
- package/dist/config/utils.js.map +1 -0
- package/dist/errors/NosanaError.d.ts +1 -0
- package/dist/errors/NosanaError.js +2 -0
- package/dist/errors/NosanaError.js.map +1 -0
- package/dist/generated_clients/jobs/accounts/index.d.ts +5 -5
- package/dist/generated_clients/jobs/accounts/index.js +6 -5
- package/dist/generated_clients/jobs/accounts/index.js.map +1 -0
- package/dist/generated_clients/jobs/accounts/jobAccount.d.ts +10 -6
- package/dist/generated_clients/jobs/accounts/jobAccount.js +6 -2
- package/dist/generated_clients/jobs/accounts/jobAccount.js.map +1 -0
- package/dist/generated_clients/jobs/accounts/marketAccount.d.ts +6 -2
- package/dist/generated_clients/jobs/accounts/marketAccount.js +6 -2
- package/dist/generated_clients/jobs/accounts/marketAccount.js.map +1 -0
- package/dist/generated_clients/jobs/accounts/runAccount.d.ts +10 -6
- package/dist/generated_clients/jobs/accounts/runAccount.js +6 -2
- package/dist/generated_clients/jobs/accounts/runAccount.js.map +1 -0
- package/dist/generated_clients/jobs/errors/index.d.ts +3 -3
- package/dist/generated_clients/jobs/errors/index.js +4 -3
- package/dist/generated_clients/jobs/errors/index.js.map +1 -0
- package/dist/generated_clients/jobs/errors/nosanaJobs.d.ts +2 -2
- package/dist/generated_clients/jobs/errors/nosanaJobs.js +4 -3
- package/dist/generated_clients/jobs/errors/nosanaJobs.js.map +1 -0
- package/dist/generated_clients/jobs/index.d.ts +7 -7
- package/dist/generated_clients/jobs/index.js +8 -7
- package/dist/generated_clients/jobs/index.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/assign.d.ts +14 -14
- package/dist/generated_clients/jobs/instructions/assign.js +8 -8
- package/dist/generated_clients/jobs/instructions/assign.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/claim.d.ts +13 -13
- package/dist/generated_clients/jobs/instructions/claim.js +8 -8
- package/dist/generated_clients/jobs/instructions/claim.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/clean.d.ts +10 -10
- package/dist/generated_clients/jobs/instructions/clean.js +8 -8
- package/dist/generated_clients/jobs/instructions/clean.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/cleanAdmin.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/cleanAdmin.js +8 -8
- package/dist/generated_clients/jobs/instructions/cleanAdmin.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/close.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/close.js +8 -8
- package/dist/generated_clients/jobs/instructions/close.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/closeAdmin.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/closeAdmin.js +8 -8
- package/dist/generated_clients/jobs/instructions/closeAdmin.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/complete.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/complete.js +9 -12
- package/dist/generated_clients/jobs/instructions/complete.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/delist.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/delist.js +8 -8
- package/dist/generated_clients/jobs/instructions/delist.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/end.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/end.js +8 -8
- package/dist/generated_clients/jobs/instructions/end.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/extend.d.ts +12 -12
- package/dist/generated_clients/jobs/instructions/extend.js +8 -8
- package/dist/generated_clients/jobs/instructions/extend.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/finish.d.ts +23 -20
- package/dist/generated_clients/jobs/instructions/finish.js +15 -12
- package/dist/generated_clients/jobs/instructions/finish.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/index.d.ts +21 -21
- package/dist/generated_clients/jobs/instructions/index.js +22 -21
- package/dist/generated_clients/jobs/instructions/index.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/list.d.ts +14 -14
- package/dist/generated_clients/jobs/instructions/list.js +8 -8
- package/dist/generated_clients/jobs/instructions/list.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/open.d.ts +12 -12
- package/dist/generated_clients/jobs/instructions/open.js +8 -8
- package/dist/generated_clients/jobs/instructions/open.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/quit.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/quit.js +8 -8
- package/dist/generated_clients/jobs/instructions/quit.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/quitAdmin.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/quitAdmin.js +8 -8
- package/dist/generated_clients/jobs/instructions/quitAdmin.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/recover.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/recover.js +8 -8
- package/dist/generated_clients/jobs/instructions/recover.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/stop.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/stop.js +8 -8
- package/dist/generated_clients/jobs/instructions/stop.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/update.d.ts +11 -11
- package/dist/generated_clients/jobs/instructions/update.js +8 -8
- package/dist/generated_clients/jobs/instructions/update.js.map +1 -0
- package/dist/generated_clients/jobs/instructions/work.d.ts +13 -13
- package/dist/generated_clients/jobs/instructions/work.js +8 -8
- package/dist/generated_clients/jobs/instructions/work.js.map +1 -0
- package/dist/generated_clients/jobs/programs/index.d.ts +3 -3
- package/dist/generated_clients/jobs/programs/index.js +4 -3
- package/dist/generated_clients/jobs/programs/index.js.map +1 -0
- package/dist/generated_clients/jobs/programs/nosanaJobs.d.ts +52 -50
- package/dist/generated_clients/jobs/programs/nosanaJobs.js +30 -31
- package/dist/generated_clients/jobs/programs/nosanaJobs.js.map +1 -0
- package/dist/generated_clients/jobs/shared/index.d.ts +5 -5
- package/dist/generated_clients/jobs/shared/index.js +4 -3
- package/dist/generated_clients/jobs/shared/index.js.map +1 -0
- package/dist/generated_clients/jobs/types/index.d.ts +5 -5
- package/dist/generated_clients/jobs/types/index.js +6 -5
- package/dist/generated_clients/jobs/types/index.js.map +1 -0
- package/dist/generated_clients/jobs/types/jobState.d.ts +12 -11
- package/dist/generated_clients/jobs/types/jobState.js +8 -8
- package/dist/generated_clients/jobs/types/jobState.js.map +1 -0
- package/dist/generated_clients/jobs/types/jobType.d.ts +15 -14
- package/dist/generated_clients/jobs/types/jobType.js +11 -11
- package/dist/generated_clients/jobs/types/jobType.js.map +1 -0
- package/dist/generated_clients/jobs/types/queueType.d.ts +12 -11
- package/dist/generated_clients/jobs/types/queueType.js +8 -8
- package/dist/generated_clients/jobs/types/queueType.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/accounts/claimStatus.d.ts +10 -6
- package/dist/generated_clients/merkle_distributor/accounts/claimStatus.js +6 -2
- package/dist/generated_clients/merkle_distributor/accounts/claimStatus.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/accounts/index.d.ts +4 -4
- package/dist/generated_clients/merkle_distributor/accounts/index.js +5 -4
- package/dist/generated_clients/merkle_distributor/accounts/index.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/accounts/merkleDistributor.d.ts +10 -6
- package/dist/generated_clients/merkle_distributor/accounts/merkleDistributor.js +6 -2
- package/dist/generated_clients/merkle_distributor/accounts/merkleDistributor.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/errors/index.d.ts +3 -3
- package/dist/generated_clients/merkle_distributor/errors/index.js +4 -3
- package/dist/generated_clients/merkle_distributor/errors/index.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/errors/merkleDistributor.d.ts +2 -2
- package/dist/generated_clients/merkle_distributor/errors/merkleDistributor.js +4 -3
- package/dist/generated_clients/merkle_distributor/errors/merkleDistributor.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/index.d.ts +6 -6
- package/dist/generated_clients/merkle_distributor/index.js +7 -6
- package/dist/generated_clients/merkle_distributor/index.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/instructions/claimLocked.d.ts +11 -11
- package/dist/generated_clients/merkle_distributor/instructions/claimLocked.js +8 -8
- package/dist/generated_clients/merkle_distributor/instructions/claimLocked.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/instructions/clawback.d.ts +11 -11
- package/dist/generated_clients/merkle_distributor/instructions/clawback.js +8 -8
- package/dist/generated_clients/merkle_distributor/instructions/clawback.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/instructions/closeClaimStatus.d.ts +11 -11
- package/dist/generated_clients/merkle_distributor/instructions/closeClaimStatus.js +8 -8
- package/dist/generated_clients/merkle_distributor/instructions/closeClaimStatus.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/instructions/closeDistributor.d.ts +11 -11
- package/dist/generated_clients/merkle_distributor/instructions/closeDistributor.js +8 -8
- package/dist/generated_clients/merkle_distributor/instructions/closeDistributor.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/instructions/index.d.ts +11 -11
- package/dist/generated_clients/merkle_distributor/instructions/index.js +12 -11
- package/dist/generated_clients/merkle_distributor/instructions/index.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/instructions/newClaim.d.ts +8 -8
- package/dist/generated_clients/merkle_distributor/instructions/newClaim.js +8 -8
- package/dist/generated_clients/merkle_distributor/instructions/newClaim.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/instructions/newDistributor.d.ts +11 -11
- package/dist/generated_clients/merkle_distributor/instructions/newDistributor.js +8 -8
- package/dist/generated_clients/merkle_distributor/instructions/newDistributor.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/instructions/setAdmin.d.ts +11 -11
- package/dist/generated_clients/merkle_distributor/instructions/setAdmin.js +8 -8
- package/dist/generated_clients/merkle_distributor/instructions/setAdmin.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/instructions/setClawbackReceiver.d.ts +11 -11
- package/dist/generated_clients/merkle_distributor/instructions/setClawbackReceiver.js +8 -8
- package/dist/generated_clients/merkle_distributor/instructions/setClawbackReceiver.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/instructions/setEnableSlot.d.ts +11 -11
- package/dist/generated_clients/merkle_distributor/instructions/setEnableSlot.js +9 -12
- package/dist/generated_clients/merkle_distributor/instructions/setEnableSlot.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/programs/index.d.ts +3 -3
- package/dist/generated_clients/merkle_distributor/programs/index.js +4 -3
- package/dist/generated_clients/merkle_distributor/programs/index.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/programs/merkleDistributor.d.ts +29 -27
- package/dist/generated_clients/merkle_distributor/programs/merkleDistributor.js +18 -19
- package/dist/generated_clients/merkle_distributor/programs/merkleDistributor.js.map +1 -0
- package/dist/generated_clients/merkle_distributor/shared/index.d.ts +5 -5
- package/dist/generated_clients/merkle_distributor/shared/index.js +4 -3
- package/dist/generated_clients/merkle_distributor/shared/index.js.map +1 -0
- package/dist/generated_clients/staking/accounts/index.d.ts +4 -4
- package/dist/generated_clients/staking/accounts/index.js +5 -4
- package/dist/generated_clients/staking/accounts/index.js.map +1 -0
- package/dist/generated_clients/staking/accounts/settingsAccount.d.ts +9 -6
- package/dist/generated_clients/staking/accounts/settingsAccount.js +6 -2
- package/dist/generated_clients/staking/accounts/settingsAccount.js.map +1 -0
- package/dist/generated_clients/staking/accounts/stakeAccount.d.ts +9 -6
- package/dist/generated_clients/staking/accounts/stakeAccount.js +6 -2
- package/dist/generated_clients/staking/accounts/stakeAccount.js.map +1 -0
- package/dist/generated_clients/staking/errors/index.d.ts +3 -3
- package/dist/generated_clients/staking/errors/index.js +4 -3
- package/dist/generated_clients/staking/errors/index.js.map +1 -0
- package/dist/generated_clients/staking/errors/nosanaStaking.d.ts +2 -2
- package/dist/generated_clients/staking/errors/nosanaStaking.js +4 -3
- package/dist/generated_clients/staking/errors/nosanaStaking.js.map +1 -0
- package/dist/generated_clients/staking/index.d.ts +6 -6
- package/dist/generated_clients/staking/index.js +7 -6
- package/dist/generated_clients/staking/index.js.map +1 -0
- package/dist/generated_clients/staking/instructions/close.d.ts +11 -11
- package/dist/generated_clients/staking/instructions/close.js +8 -8
- package/dist/generated_clients/staking/instructions/close.js.map +1 -0
- package/dist/generated_clients/staking/instructions/extend.d.ts +11 -11
- package/dist/generated_clients/staking/instructions/extend.js +9 -12
- package/dist/generated_clients/staking/instructions/extend.js.map +1 -0
- package/dist/generated_clients/staking/instructions/index.d.ts +12 -12
- package/dist/generated_clients/staking/instructions/index.js +13 -12
- package/dist/generated_clients/staking/instructions/index.js.map +1 -0
- package/dist/generated_clients/staking/instructions/init.d.ts +11 -11
- package/dist/generated_clients/staking/instructions/init.js +8 -8
- package/dist/generated_clients/staking/instructions/init.js.map +1 -0
- package/dist/generated_clients/staking/instructions/restake.d.ts +11 -11
- package/dist/generated_clients/staking/instructions/restake.js +8 -8
- package/dist/generated_clients/staking/instructions/restake.js.map +1 -0
- package/dist/generated_clients/staking/instructions/slash.d.ts +11 -11
- package/dist/generated_clients/staking/instructions/slash.js +8 -8
- package/dist/generated_clients/staking/instructions/slash.js.map +1 -0
- package/dist/generated_clients/staking/instructions/stake.d.ts +11 -11
- package/dist/generated_clients/staking/instructions/stake.js +8 -8
- package/dist/generated_clients/staking/instructions/stake.js.map +1 -0
- package/dist/generated_clients/staking/instructions/topup.d.ts +11 -11
- package/dist/generated_clients/staking/instructions/topup.js +8 -8
- package/dist/generated_clients/staking/instructions/topup.js.map +1 -0
- package/dist/generated_clients/staking/instructions/unstake.d.ts +11 -11
- package/dist/generated_clients/staking/instructions/unstake.js +8 -8
- package/dist/generated_clients/staking/instructions/unstake.js.map +1 -0
- package/dist/generated_clients/staking/instructions/updateSettings.d.ts +11 -11
- package/dist/generated_clients/staking/instructions/updateSettings.js +8 -8
- package/dist/generated_clients/staking/instructions/updateSettings.js.map +1 -0
- package/dist/generated_clients/staking/instructions/withdraw.d.ts +11 -11
- package/dist/generated_clients/staking/instructions/withdraw.js +8 -8
- package/dist/generated_clients/staking/instructions/withdraw.js.map +1 -0
- package/dist/generated_clients/staking/programs/index.d.ts +3 -3
- package/dist/generated_clients/staking/programs/index.js +4 -3
- package/dist/generated_clients/staking/programs/index.js.map +1 -0
- package/dist/generated_clients/staking/programs/nosanaStaking.d.ts +33 -31
- package/dist/generated_clients/staking/programs/nosanaStaking.js +20 -21
- package/dist/generated_clients/staking/programs/nosanaStaking.js.map +1 -0
- package/dist/generated_clients/staking/shared/index.d.ts +5 -5
- package/dist/generated_clients/staking/shared/index.js +4 -3
- package/dist/generated_clients/staking/shared/index.js.map +1 -0
- package/dist/index.d.ts +13 -32
- package/dist/index.js +13 -37
- package/dist/index.js.map +1 -0
- package/dist/logger/Logger.d.ts +4 -4
- package/dist/logger/Logger.js +7 -2
- package/dist/logger/Logger.js.map +1 -0
- package/dist/services/SolanaService.d.ts +49 -26
- package/dist/services/SolanaService.js +191 -133
- package/dist/services/SolanaService.js.map +1 -0
- package/dist/services/TokenService.d.ts +41 -0
- package/dist/services/TokenService.js +136 -0
- package/dist/services/TokenService.js.map +1 -0
- package/dist/services/programs/JobsProgram.d.ts +106 -0
- package/dist/services/programs/JobsProgram.js +584 -0
- package/dist/services/programs/JobsProgram.js.map +1 -0
- package/dist/services/programs/MerkleDistributorProgram.d.ts +101 -0
- package/dist/services/programs/MerkleDistributorProgram.js +343 -0
- package/dist/services/programs/MerkleDistributorProgram.js.map +1 -0
- package/dist/services/programs/StakeProgram.d.ts +46 -0
- package/dist/services/programs/StakeProgram.js +87 -0
- package/dist/services/programs/StakeProgram.js.map +1 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/convertBigIntToNumber.d.ts +19 -0
- package/dist/utils/convertBigIntToNumber.js +15 -0
- package/dist/utils/convertBigIntToNumber.js.map +1 -0
- package/dist/utils/getStaticAccounts.d.ts +23 -0
- package/dist/utils/getStaticAccounts.js +39 -0
- package/dist/utils/getStaticAccounts.js.map +1 -0
- package/dist/utils/index.d.ts +3 -20
- package/dist/utils/index.js +5 -16
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/walletToAuthorizationSigner.d.ts +10 -0
- package/dist/utils/walletToAuthorizationSigner.js +42 -0
- package/dist/utils/walletToAuthorizationSigner.js.map +1 -0
- package/package.json +17 -14
- package/dist/ipfs/IPFS.d.ts +0 -50
- package/dist/ipfs/IPFS.js +0 -149
- package/dist/programs/BaseProgram.d.ts +0 -20
- package/dist/programs/BaseProgram.js +0 -31
- package/dist/programs/JobsProgram.d.ts +0 -129
- package/dist/programs/JobsProgram.js +0 -559
- package/dist/programs/MerkleDistributorProgram.d.ts +0 -115
- package/dist/programs/MerkleDistributorProgram.js +0 -337
- package/dist/programs/StakeProgram.d.ts +0 -29
- package/dist/programs/StakeProgram.js +0 -91
- package/dist/services/NosService.d.ts +0 -48
- package/dist/services/NosService.js +0 -139
- package/dist/utils/walletConverter.d.ts +0 -9
- package/dist/utils/walletConverter.js +0 -141
package/dist/index.d.ts
CHANGED
|
@@ -1,38 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { StakeProgram } from './programs/StakeProgram.js';
|
|
5
|
-
import { MerkleDistributorProgram } from './programs/MerkleDistributorProgram.js';
|
|
6
|
-
import { SolanaService } from './services/SolanaService.js';
|
|
7
|
-
import { NosService } from './services/NosService.js';
|
|
8
|
-
import { IPFS } from './ipfs/IPFS.js';
|
|
9
|
-
import { KeyPairSigner } from 'gill';
|
|
10
|
-
export declare class NosanaClient {
|
|
11
|
-
readonly config: ClientConfig;
|
|
12
|
-
readonly jobs: JobsProgram;
|
|
13
|
-
readonly stake: StakeProgram;
|
|
14
|
-
readonly merkleDistributor: MerkleDistributorProgram;
|
|
15
|
-
readonly solana: SolanaService;
|
|
16
|
-
readonly nos: NosService;
|
|
17
|
-
readonly ipfs: IPFS;
|
|
18
|
-
readonly logger: Logger;
|
|
19
|
-
wallet: KeyPairSigner | undefined;
|
|
20
|
-
constructor(network?: NosanaNetwork, customConfig?: PartialClientConfig);
|
|
21
|
-
setWallet(wallet: WalletConfig): Promise<KeyPairSigner | undefined>;
|
|
22
|
-
}
|
|
1
|
+
export { createNosanaClient, type NosanaClient } from './NosanaClient.js';
|
|
2
|
+
export * from '@nosana/types';
|
|
3
|
+
export type { Wallet } from './types.js';
|
|
23
4
|
export * from './config/index.js';
|
|
24
5
|
export * from './errors/NosanaError.js';
|
|
25
6
|
export * from './logger/Logger.js';
|
|
26
|
-
export { JobsProgram, JobState, MarketQueueType } from './programs/JobsProgram.js';
|
|
27
|
-
export type { Job, Market, Run } from './programs/JobsProgram.js';
|
|
28
|
-
export { StakeProgram } from './programs/StakeProgram.js';
|
|
29
|
-
export type { Stake } from './programs/StakeProgram.js';
|
|
30
|
-
export { MerkleDistributorProgram, ClaimTarget } from './programs/MerkleDistributorProgram.js';
|
|
31
|
-
export type { MerkleDistributor, ClaimStatus } from './programs/MerkleDistributorProgram.js';
|
|
32
|
-
export
|
|
33
|
-
export {
|
|
34
|
-
export
|
|
7
|
+
export { createJobsProgram, type JobsProgram, JobState, MarketQueueType, } from './services/programs/JobsProgram.js';
|
|
8
|
+
export type { Job, Market, Run } from './services/programs/JobsProgram.js';
|
|
9
|
+
export { createStakeProgram, type StakeProgram } from './services/programs/StakeProgram.js';
|
|
10
|
+
export type { Stake } from './services/programs/StakeProgram.js';
|
|
11
|
+
export { createMerkleDistributorProgram, type MerkleDistributorProgram, ClaimTarget, } from './services/programs/MerkleDistributorProgram.js';
|
|
12
|
+
export type { MerkleDistributor, ClaimStatus, } from './services/programs/MerkleDistributorProgram.js';
|
|
13
|
+
export { ClaimStatusNotFoundError } from './services/programs/MerkleDistributorProgram.js';
|
|
14
|
+
export { solBytesArrayToIpfsHash, ipfsHashToSolBytesArray } from '@nosana/ipfs';
|
|
15
|
+
export { createTokenService, type TokenService } from './services/TokenService.js';
|
|
16
|
+
export type { TokenAccount, TokenAccountWithBalance } from './services/TokenService.js';
|
|
35
17
|
export * as JobsClient from './generated_clients/jobs/index.js';
|
|
36
18
|
export * as StakingClient from './generated_clients/staking/index.js';
|
|
37
19
|
export * as MerkleDistributorClient from './generated_clients/merkle_distributor/index.js';
|
|
38
|
-
export * from 'gill';
|
package/dist/index.js
CHANGED
|
@@ -1,48 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { MerkleDistributorProgram } from './programs/MerkleDistributorProgram.js';
|
|
6
|
-
import { SolanaService } from './services/SolanaService.js';
|
|
7
|
-
import { NosService } from './services/NosService.js';
|
|
8
|
-
import { IPFS } from './ipfs/IPFS.js';
|
|
9
|
-
import { convertWalletConfigToKeyPairSigner } from './utils/walletConverter.js';
|
|
10
|
-
export class NosanaClient {
|
|
11
|
-
constructor(network = NosanaNetwork.MAINNET, customConfig) {
|
|
12
|
-
this.config = getNosanaConfig(network, customConfig);
|
|
13
|
-
if (this.config.wallet) {
|
|
14
|
-
this.setWallet(this.config.wallet);
|
|
15
|
-
}
|
|
16
|
-
this.jobs = new JobsProgram(this);
|
|
17
|
-
this.stake = new StakeProgram(this);
|
|
18
|
-
this.merkleDistributor = new MerkleDistributorProgram(this);
|
|
19
|
-
this.logger = Logger.getInstance();
|
|
20
|
-
this.solana = new SolanaService(this);
|
|
21
|
-
this.nos = new NosService(this);
|
|
22
|
-
this.ipfs = new IPFS(this.config.ipfs);
|
|
23
|
-
}
|
|
24
|
-
async setWallet(wallet) {
|
|
25
|
-
this.wallet = await convertWalletConfigToKeyPairSigner(wallet);
|
|
26
|
-
return this.wallet;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
1
|
+
// Export the main client
|
|
2
|
+
export { createNosanaClient } from './NosanaClient.js';
|
|
3
|
+
// Export types
|
|
4
|
+
export * from '@nosana/types';
|
|
29
5
|
// Export types and configuration
|
|
30
6
|
export * from './config/index.js';
|
|
31
7
|
export * from './errors/NosanaError.js';
|
|
32
8
|
export * from './logger/Logger.js';
|
|
33
9
|
// Export JobsProgram and related types
|
|
34
|
-
export {
|
|
10
|
+
export { createJobsProgram, JobState, MarketQueueType, } from './services/programs/JobsProgram.js';
|
|
35
11
|
// Export StakeProgram and related types
|
|
36
|
-
export {
|
|
12
|
+
export { createStakeProgram } from './services/programs/StakeProgram.js';
|
|
37
13
|
// Export MerkleDistributorProgram and related types
|
|
38
|
-
export {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
14
|
+
export { createMerkleDistributorProgram, ClaimTarget, } from './services/programs/MerkleDistributorProgram.js';
|
|
15
|
+
export { ClaimStatusNotFoundError } from './services/programs/MerkleDistributorProgram.js';
|
|
16
|
+
// Export IPFS utilities from @nosana/ipfs
|
|
17
|
+
export { solBytesArrayToIpfsHash, ipfsHashToSolBytesArray } from '@nosana/ipfs';
|
|
18
|
+
// Export token service
|
|
19
|
+
export { createTokenService } from './services/TokenService.js';
|
|
43
20
|
// Export generated clients under namespaces to avoid naming conflicts
|
|
44
21
|
export * as JobsClient from './generated_clients/jobs/index.js';
|
|
45
22
|
export * as StakingClient from './generated_clients/staking/index.js';
|
|
46
23
|
export * as MerkleDistributorClient from './generated_clients/merkle_distributor/index.js';
|
|
47
|
-
|
|
48
|
-
export * from 'gill';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAqB,MAAM,mBAAmB,CAAC;AAE1E,eAAe;AACf,cAAc,eAAe,CAAC;AAG9B,iCAAiC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AAEnC,uCAAuC;AACvC,OAAO,EACL,iBAAiB,EAEjB,QAAQ,EACR,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAG5C,wCAAwC;AACxC,OAAO,EAAE,kBAAkB,EAAqB,MAAM,qCAAqC,CAAC;AAG5F,oDAAoD;AACpD,OAAO,EACL,8BAA8B,EAE9B,WAAW,GACZ,MAAM,iDAAiD,CAAC;AAKzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,0CAA0C;AAC1C,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEhF,uBAAuB;AACvB,OAAO,EAAE,kBAAkB,EAAqB,MAAM,4BAA4B,CAAC;AAGnF,sEAAsE;AACtE,OAAO,KAAK,UAAU,MAAM,mCAAmC,CAAC;AAChE,OAAO,KAAK,aAAa,MAAM,sCAAsC,CAAC;AACtE,OAAO,KAAK,uBAAuB,MAAM,iDAAiD,CAAC"}
|
package/dist/logger/Logger.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type LogLevel = '
|
|
1
|
+
export type LogLevel = 'none' | 'error' | 'warn' | 'info' | 'debug';
|
|
2
2
|
export interface LoggerOptions {
|
|
3
3
|
level?: LogLevel;
|
|
4
4
|
prefix?: string;
|
|
@@ -6,9 +6,9 @@ export interface LoggerOptions {
|
|
|
6
6
|
}
|
|
7
7
|
export declare class Logger {
|
|
8
8
|
private static instance;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
level: LogLevel;
|
|
10
|
+
prefix: string;
|
|
11
|
+
enabled: boolean;
|
|
12
12
|
private constructor();
|
|
13
13
|
static getInstance(options?: LoggerOptions): Logger;
|
|
14
14
|
private shouldLog;
|
package/dist/logger/Logger.js
CHANGED
|
@@ -16,10 +16,14 @@ export class Logger {
|
|
|
16
16
|
return Logger.instance;
|
|
17
17
|
}
|
|
18
18
|
shouldLog(messageLevel) {
|
|
19
|
-
if (!this.enabled)
|
|
19
|
+
if (!this.enabled || this.level === 'none')
|
|
20
20
|
return false;
|
|
21
|
+
// Levels ordered from most verbose (debug) to least verbose (error)
|
|
22
|
+
// If level is 'info', we log 'info', 'warn', 'error' (index >= 2)
|
|
21
23
|
const levels = ['debug', 'info', 'warn', 'error'];
|
|
22
|
-
|
|
24
|
+
const currentLevelIndex = levels.indexOf(this.level);
|
|
25
|
+
const messageLevelIndex = levels.indexOf(messageLevel);
|
|
26
|
+
return messageLevelIndex >= currentLevelIndex;
|
|
23
27
|
}
|
|
24
28
|
formatMessage(level, message) {
|
|
25
29
|
return `${this.prefix} [${level.toUpperCase()}] ${message}`;
|
|
@@ -57,3 +61,4 @@ export class Logger {
|
|
|
57
61
|
this.enabled = false;
|
|
58
62
|
}
|
|
59
63
|
}
|
|
64
|
+
//# sourceMappingURL=Logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/logger/Logger.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,MAAM;IAMjB,YAAoB,OAAuB;QAJpC,UAAK,GAAa,MAAM,CAAC;QACzB,WAAM,GAAW,UAAU,CAAC;QAC5B,YAAO,GAAY,IAAI,CAAC;QAG7B,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;YACzC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;YAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QACjD,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,OAAuB;QAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,QAAQ,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEO,SAAS,CAAC,YAAuC;QACvD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QACzD,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,MAAM,GAAgC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/E,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAkC,CAAC,CAAC;QAClF,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvD,OAAO,iBAAiB,IAAI,iBAAiB,CAAC;IAChD,CAAC;IAEO,aAAa,CAAC,KAAe,EAAE,OAAe;QACpD,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;IAC9D,CAAC;IAEM,KAAK,CAAC,OAAe;QAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEM,IAAI,CAAC,OAAe;QACzB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEM,IAAI,CAAC,OAAe;QACzB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAe;QAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEM,QAAQ,CAAC,KAAe;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEM,SAAS,CAAC,MAAc;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,MAAM;QACX,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -1,29 +1,52 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
1
|
+
import { createSolanaRpc, createSolanaRpcSubscriptions, Address, Signature, Instruction, TransactionMessageWithBlockhashLifetime, sendAndConfirmTransactionFactory, TransactionMessageWithFeePayer, TransactionMessage, SendableTransaction, Transaction, BaseTransactionMessage, TransactionSigner, TransactionWithBlockhashLifetime } from '@solana/kit';
|
|
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';
|
|
6
|
+
/**
|
|
7
|
+
* Factory function to create an estimateAndSetComputeUnitLimit function
|
|
8
|
+
* that estimates compute units and adds the set compute unit limit instruction
|
|
9
|
+
*/
|
|
10
|
+
declare function estimateAndSetComputeUnitLimitFactory(...params: Parameters<typeof estimateComputeUnitLimitFactory>): <T extends BaseTransactionMessage & TransactionMessageWithFeePayer>(transactionMessage: T) => Promise<Omit<import("@solana/transaction-messages").ExcludeTransactionMessageWithinSizeLimit<T>, "instructions"> & {
|
|
11
|
+
readonly instructions: readonly [...T["instructions"], import("@solana-program/compute-budget").SetComputeUnitLimitInstruction<Address, []>];
|
|
12
|
+
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Dependencies for SolanaService
|
|
15
|
+
*/
|
|
16
|
+
export interface SolanaServiceDeps {
|
|
17
|
+
logger: Logger;
|
|
18
|
+
getWallet: () => Wallet | undefined;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Solana service interface
|
|
22
|
+
*/
|
|
23
|
+
export interface SolanaService {
|
|
24
|
+
readonly config: SolanaConfig;
|
|
25
|
+
readonly rpc: ReturnType<typeof createSolanaRpc>;
|
|
26
|
+
readonly rpcSubscriptions: ReturnType<typeof createSolanaRpcSubscriptions>;
|
|
27
|
+
readonly sendAndConfirmTransaction: ReturnType<typeof sendAndConfirmTransactionFactory>;
|
|
28
|
+
readonly estimateAndSetComputeUnitLimit: ReturnType<typeof estimateAndSetComputeUnitLimitFactory>;
|
|
23
29
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* @returns The transaction signature
|
|
30
|
+
* Optional fee payer for transactions. If set, will be used as fallback when no feePayer is provided in options.
|
|
31
|
+
* Set this property directly to configure the fee payer.
|
|
27
32
|
*/
|
|
28
|
-
|
|
33
|
+
feePayer: TransactionSigner | undefined;
|
|
34
|
+
pda(seeds: Array<Address | string>, programId: Address): Promise<Address>;
|
|
35
|
+
getBalance(addressStr?: string | Address): Promise<bigint>;
|
|
36
|
+
buildTransaction(instructions: Instruction | Instruction[], options?: {
|
|
37
|
+
feePayer?: TransactionSigner;
|
|
38
|
+
}): Promise<TransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithBlockhashLifetime>;
|
|
39
|
+
signTransaction(transactionMessage: TransactionMessage & TransactionMessageWithFeePayer & TransactionMessageWithBlockhashLifetime): Promise<SendableTransaction & Transaction & TransactionWithBlockhashLifetime>;
|
|
40
|
+
sendTransaction(transaction: SendableTransaction & Transaction & TransactionWithBlockhashLifetime, options?: {
|
|
41
|
+
commitment?: 'processed' | 'confirmed' | 'finalized';
|
|
42
|
+
}): Promise<Signature>;
|
|
43
|
+
buildSignAndSend(instructions: Instruction | Instruction[], options?: {
|
|
44
|
+
feePayer?: TransactionSigner;
|
|
45
|
+
commitment?: 'processed' | 'confirmed' | 'finalized';
|
|
46
|
+
}): Promise<Signature>;
|
|
29
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Creates a Solana service instance.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createSolanaService(deps: SolanaServiceDeps, config: SolanaConfig): SolanaService;
|
|
52
|
+
export {};
|
|
@@ -1,144 +1,202 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createSolanaRpc, createSolanaRpcSubscriptions, address, getProgramDerivedAddress, getAddressEncoder, createTransactionMessage, signTransactionMessageWithSigners, getSignatureFromTransaction, setTransactionMessageFeePayerSigner, setTransactionMessageLifetimeUsingBlockhash, sendAndConfirmTransactionFactory, appendTransactionMessageInstructions, pipe, assertIsSendableTransaction, } from '@solana/kit';
|
|
2
|
+
import { estimateComputeUnitLimitFactory, getSetComputeUnitLimitInstruction, } from '@solana-program/compute-budget';
|
|
2
3
|
import { NosanaError, ErrorCodes } from '../errors/NosanaError.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Factory function to create an estimateAndSetComputeUnitLimit function
|
|
6
|
+
* that estimates compute units and adds the set compute unit limit instruction
|
|
7
|
+
*/
|
|
8
|
+
function estimateAndSetComputeUnitLimitFactory(...params) {
|
|
9
|
+
const estimateComputeUnitLimit = estimateComputeUnitLimitFactory(...params);
|
|
10
|
+
return async (transactionMessage) => {
|
|
11
|
+
const computeUnitsEstimate = await estimateComputeUnitLimit(transactionMessage);
|
|
12
|
+
return appendTransactionMessageInstructions([getSetComputeUnitLimitInstruction({ units: computeUnitsEstimate })], transactionMessage);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates a Solana service instance.
|
|
17
|
+
*/
|
|
18
|
+
export function createSolanaService(deps, config) {
|
|
19
|
+
if (!config.rpcEndpoint) {
|
|
20
|
+
throw new NosanaError('RPC URL is required', ErrorCodes.INVALID_CONFIG);
|
|
15
21
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
22
|
+
const rpc = createSolanaRpc(config.rpcEndpoint);
|
|
23
|
+
// Use wsEndpoint if provided, otherwise fall back to rpcEndpoint
|
|
24
|
+
const rpcSubscriptions = createSolanaRpcSubscriptions(config.wsEndpoint ?? config.rpcEndpoint);
|
|
25
|
+
const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({
|
|
26
|
+
rpc,
|
|
27
|
+
rpcSubscriptions,
|
|
28
|
+
});
|
|
29
|
+
// Create a function to estimate and set the compute unit limit
|
|
30
|
+
const estimateAndSetComputeUnitLimit = estimateAndSetComputeUnitLimitFactory({ rpc });
|
|
31
|
+
// Store feePayer in a mutable variable, initialized from config
|
|
32
|
+
let feePayer = config.feePayer;
|
|
33
|
+
return {
|
|
34
|
+
config,
|
|
35
|
+
rpc,
|
|
36
|
+
rpcSubscriptions,
|
|
37
|
+
sendAndConfirmTransaction,
|
|
38
|
+
estimateAndSetComputeUnitLimit,
|
|
39
|
+
get feePayer() {
|
|
40
|
+
return feePayer;
|
|
41
|
+
},
|
|
42
|
+
set feePayer(value) {
|
|
43
|
+
feePayer = value;
|
|
44
|
+
},
|
|
45
|
+
async pda(seeds, programId) {
|
|
46
|
+
const addressEncoder = getAddressEncoder();
|
|
47
|
+
const [pda] = await getProgramDerivedAddress({
|
|
48
|
+
programAddress: programId,
|
|
49
|
+
seeds: seeds.map((seed) => {
|
|
50
|
+
// Address is a branded string type, so typeof will return 'string'
|
|
51
|
+
// We need to encode Address types to bytes for PDA seeds
|
|
52
|
+
// Try to encode if it looks like an address (base58, 32-44 chars), otherwise pass as-is
|
|
53
|
+
if (typeof seed === 'string') {
|
|
54
|
+
// Check if it's likely an address (base58 encoded addresses are 32-44 chars)
|
|
55
|
+
// Short strings like 'ClaimStatus' should be passed as-is
|
|
56
|
+
if (seed.length >= 32 && seed.length <= 44) {
|
|
57
|
+
try {
|
|
58
|
+
// Try to encode as Address - if it's a valid address, this will work
|
|
59
|
+
return addressEncoder.encode(seed);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// If encoding fails, it's not a valid address, pass as-is (e.g., 'ClaimStatus')
|
|
63
|
+
return seed;
|
|
64
|
+
}
|
|
35
65
|
}
|
|
66
|
+
// Short strings pass as-is
|
|
67
|
+
return seed;
|
|
36
68
|
}
|
|
37
|
-
//
|
|
38
|
-
return seed;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const addr = address(addressStr);
|
|
50
|
-
const balance = await this.rpc.getBalance(addr).send();
|
|
51
|
-
return balance.value;
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
this.sdk.logger.error(`Failed to get balance: ${error}`);
|
|
55
|
-
throw new NosanaError('Failed to get balance', ErrorCodes.RPC_ERROR, error);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
async getLatestBlockhash() {
|
|
59
|
-
try {
|
|
60
|
-
const { value: blockhash } = await this.rpc.getLatestBlockhash().send();
|
|
61
|
-
return blockhash;
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
this.sdk.logger.error(`Failed to get latest blockhash: ${error}`);
|
|
65
|
-
throw new NosanaError('Failed to get latest blockhash', ErrorCodes.RPC_ERROR, error);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Type guard to check if the input is a transaction
|
|
70
|
-
*/
|
|
71
|
-
isTransaction(input) {
|
|
72
|
-
return (typeof input === 'object' &&
|
|
73
|
-
input !== null &&
|
|
74
|
-
'instructions' in input &&
|
|
75
|
-
'version' in input &&
|
|
76
|
-
!('programAddress' in input));
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Type guard to check if the input is a signed transaction
|
|
80
|
-
*/
|
|
81
|
-
isSignedTransaction(input) {
|
|
82
|
-
return (typeof input === 'object' &&
|
|
83
|
-
input !== null &&
|
|
84
|
-
'signatures' in input &&
|
|
85
|
-
Array.isArray(input.signatures) &&
|
|
86
|
-
input.signatures.length > 0);
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Create, sign, and send a transaction with proper logging and error handling
|
|
90
|
-
* @param instructionsOrTransaction Single instruction, array of instructions, or pre-built transaction
|
|
91
|
-
* @returns The transaction signature
|
|
92
|
-
*/
|
|
93
|
-
async send(instructionsOrTransaction) {
|
|
94
|
-
if (!this.sdk.wallet) {
|
|
95
|
-
throw new NosanaError('No wallet found', ErrorCodes.NO_WALLET);
|
|
96
|
-
}
|
|
97
|
-
try {
|
|
98
|
-
let signedTransaction;
|
|
99
|
-
// Check if it's already a transaction or if we need to create one from instructions
|
|
100
|
-
if (this.isTransaction(instructionsOrTransaction)) {
|
|
101
|
-
// Check if it's already signed
|
|
102
|
-
if (this.isSignedTransaction(instructionsOrTransaction)) {
|
|
103
|
-
// Already signed, use it directly
|
|
104
|
-
signedTransaction = instructionsOrTransaction;
|
|
69
|
+
// Non-string types should be encoded
|
|
70
|
+
return addressEncoder.encode(seed);
|
|
71
|
+
}),
|
|
72
|
+
});
|
|
73
|
+
return pda;
|
|
74
|
+
},
|
|
75
|
+
async getBalance(addressStr) {
|
|
76
|
+
try {
|
|
77
|
+
// Use wallet address if no address is provided
|
|
78
|
+
let addr;
|
|
79
|
+
if (addressStr) {
|
|
80
|
+
addr = address(addressStr);
|
|
105
81
|
}
|
|
106
82
|
else {
|
|
107
|
-
|
|
108
|
-
|
|
83
|
+
const wallet = deps.getWallet();
|
|
84
|
+
if (!wallet) {
|
|
85
|
+
throw new NosanaError('No wallet found and no address provided', ErrorCodes.NO_WALLET);
|
|
86
|
+
}
|
|
87
|
+
addr = wallet.address;
|
|
109
88
|
}
|
|
89
|
+
deps.logger.debug(`Getting balance for address: ${addr}`);
|
|
90
|
+
const balance = await rpc.getBalance(addr).send();
|
|
91
|
+
return balance.value;
|
|
110
92
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (error instanceof NosanaError) {
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
deps.logger.error(`Failed to get balance: ${error}`);
|
|
98
|
+
throw new NosanaError('Failed to get balance', ErrorCodes.RPC_ERROR, error);
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
/**
|
|
102
|
+
* Build a transaction message from instructions
|
|
103
|
+
* This function creates a transaction message with:
|
|
104
|
+
* - Fee payer set to the provided feePayer, service feePayer, or wallet (in that order)
|
|
105
|
+
* - Latest blockhash for lifetime
|
|
106
|
+
* - Provided instructions
|
|
107
|
+
* - Estimated compute unit limit
|
|
108
|
+
*
|
|
109
|
+
* @param instructions Single instruction or array of instructions
|
|
110
|
+
* @param options Optional configuration
|
|
111
|
+
* @param options.feePayer Optional custom fee payer. Takes precedence over service feePayer and wallet.
|
|
112
|
+
* @returns An unsigned transaction message ready to be signed
|
|
113
|
+
*/
|
|
114
|
+
async buildTransaction(instructions, options) {
|
|
115
|
+
// Priority: options.feePayer > service.feePayer > wallet
|
|
116
|
+
const transactionFeePayer = options?.feePayer ?? feePayer ?? deps.getWallet();
|
|
117
|
+
if (!transactionFeePayer) {
|
|
118
|
+
throw new NosanaError('No wallet found and no feePayer provided', ErrorCodes.NO_WALLET);
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
// Get latest blockhash
|
|
122
|
+
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
|
|
123
|
+
// Normalize instructions to array
|
|
124
|
+
const instructionsArray = Array.isArray(instructions) ? instructions : [instructions];
|
|
125
|
+
// Build transaction message using pipe
|
|
126
|
+
const transactionMessage = await pipe(createTransactionMessage({ version: 0 }), (tx) => setTransactionMessageFeePayerSigner(transactionFeePayer, tx), (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), (tx) => appendTransactionMessageInstructions(instructionsArray, tx), (tx) => estimateAndSetComputeUnitLimit(tx));
|
|
127
|
+
return transactionMessage;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
deps.logger.error(`Failed to build transaction: ${error}`);
|
|
131
|
+
throw new NosanaError('Failed to build transaction', ErrorCodes.RPC_ERROR, error);
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
/**
|
|
135
|
+
* Sign a transaction message
|
|
136
|
+
* This function signs the transaction message using the signers embedded in the message.
|
|
137
|
+
* The transaction message should already contain the signers (e.g., from buildTransaction).
|
|
138
|
+
*
|
|
139
|
+
* @param transactionMessage The transaction message to sign (must contain signers)
|
|
140
|
+
* @returns A signed transaction
|
|
141
|
+
*/
|
|
142
|
+
async signTransaction(transactionMessage) {
|
|
143
|
+
try {
|
|
144
|
+
// Sign the transaction message using signers embedded in the message
|
|
145
|
+
const transaction = await signTransactionMessageWithSigners(transactionMessage);
|
|
146
|
+
return transaction;
|
|
124
147
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
148
|
+
catch (error) {
|
|
149
|
+
deps.logger.error(`Failed to sign transaction: ${error}`);
|
|
150
|
+
throw new NosanaError('Failed to sign transaction', ErrorCodes.TRANSACTION_ERROR, error);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
/**
|
|
154
|
+
* Send and confirm a signed transaction
|
|
155
|
+
* This function validates that the transaction is sendable, then sends it and waits for confirmation.
|
|
156
|
+
*
|
|
157
|
+
* @param transaction The signed transaction to send
|
|
158
|
+
* @param options Optional configuration (same as sendAndConfirmTransaction)
|
|
159
|
+
* @param options.commitment Commitment level for confirmation (takes precedence over config, then falls back to config.commitment, then 'confirmed')
|
|
160
|
+
* @returns The transaction signature
|
|
161
|
+
*/
|
|
162
|
+
async sendTransaction(transaction, options) {
|
|
163
|
+
try {
|
|
164
|
+
// Ensure the transaction is sendable before attempting to send
|
|
165
|
+
assertIsSendableTransaction(transaction);
|
|
166
|
+
// Get the transaction signature for logging
|
|
167
|
+
const signature = getSignatureFromTransaction(transaction);
|
|
168
|
+
deps.logger.info(`Sending transaction: ${signature}`);
|
|
169
|
+
// Send and confirm the transaction with optional commitment level
|
|
170
|
+
// Priority: options.commitment > config.commitment > 'confirmed'
|
|
171
|
+
const commitment = options?.commitment ?? config.commitment ?? 'confirmed';
|
|
172
|
+
await sendAndConfirmTransaction(transaction, { commitment });
|
|
173
|
+
deps.logger.info(`Transaction ${signature} confirmed!`);
|
|
174
|
+
return signature;
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
const errorMessage = `Failed to send transaction: ${error instanceof Error ? error.message : String(error)}`;
|
|
178
|
+
deps.logger.error(errorMessage);
|
|
179
|
+
throw new NosanaError(errorMessage, ErrorCodes.RPC_ERROR, error);
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
/**
|
|
183
|
+
* Build, sign, and send a transaction in one call
|
|
184
|
+
* This is a convenience function that combines buildTransaction, signTransaction, and sendTransaction.
|
|
185
|
+
* Use this when you want to build, sign, and send in a single operation.
|
|
186
|
+
*
|
|
187
|
+
* @param instructions Single instruction or array of instructions
|
|
188
|
+
* @param options Optional configuration
|
|
189
|
+
* @param options.feePayer Optional custom fee payer. If not provided, uses the wallet.
|
|
190
|
+
* @param options.commitment Commitment level for confirmation (takes precedence over config, then falls back to config.commitment, then 'confirmed')
|
|
191
|
+
* @returns The transaction signature
|
|
192
|
+
*/
|
|
193
|
+
async buildSignAndSend(instructions, options) {
|
|
194
|
+
const transactionMessage = await this.buildTransaction(instructions, {
|
|
195
|
+
feePayer: options?.feePayer,
|
|
131
196
|
});
|
|
132
|
-
this.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
return signature;
|
|
137
|
-
}
|
|
138
|
-
catch (err) {
|
|
139
|
-
const errorMessage = `Failed to send transaction: ${err instanceof Error ? err.message : String(err)}`;
|
|
140
|
-
this.sdk.logger.error(errorMessage);
|
|
141
|
-
throw new Error(errorMessage);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
197
|
+
const signedTransaction = await this.signTransaction(transactionMessage);
|
|
198
|
+
return await this.sendTransaction(signedTransaction, { commitment: options?.commitment });
|
|
199
|
+
},
|
|
200
|
+
};
|
|
144
201
|
}
|
|
202
|
+
//# sourceMappingURL=SolanaService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolanaService.js","sourceRoot":"","sources":["../../src/services/SolanaService.ts"],"names":[],"mappings":"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"}
|