@oobe-protocol-labs/synapse-sap-sdk 0.1.0

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 (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +882 -0
  3. package/dist/cjs/constants/index.js +43 -0
  4. package/dist/cjs/constants/index.js.map +1 -0
  5. package/dist/cjs/constants/limits.js +161 -0
  6. package/dist/cjs/constants/limits.js.map +1 -0
  7. package/dist/cjs/constants/programs.js +78 -0
  8. package/dist/cjs/constants/programs.js.map +1 -0
  9. package/dist/cjs/constants/seeds.js +57 -0
  10. package/dist/cjs/constants/seeds.js.map +1 -0
  11. package/dist/cjs/core/client.js +391 -0
  12. package/dist/cjs/core/client.js.map +1 -0
  13. package/dist/cjs/core/connection.js +319 -0
  14. package/dist/cjs/core/connection.js.map +1 -0
  15. package/dist/cjs/core/index.js +24 -0
  16. package/dist/cjs/core/index.js.map +1 -0
  17. package/dist/cjs/errors/index.js +334 -0
  18. package/dist/cjs/errors/index.js.map +1 -0
  19. package/dist/cjs/events/index.js +136 -0
  20. package/dist/cjs/events/index.js.map +1 -0
  21. package/dist/cjs/idl/index.js +63 -0
  22. package/dist/cjs/idl/index.js.map +1 -0
  23. package/dist/cjs/idl/synapse_agent_sap.json +9710 -0
  24. package/dist/cjs/index.js +147 -0
  25. package/dist/cjs/index.js.map +1 -0
  26. package/dist/cjs/modules/agent.js +272 -0
  27. package/dist/cjs/modules/agent.js.map +1 -0
  28. package/dist/cjs/modules/attestation.js +147 -0
  29. package/dist/cjs/modules/attestation.js.map +1 -0
  30. package/dist/cjs/modules/base.js +128 -0
  31. package/dist/cjs/modules/base.js.map +1 -0
  32. package/dist/cjs/modules/escrow.js +246 -0
  33. package/dist/cjs/modules/escrow.js.map +1 -0
  34. package/dist/cjs/modules/feedback.js +166 -0
  35. package/dist/cjs/modules/feedback.js.map +1 -0
  36. package/dist/cjs/modules/index.js +35 -0
  37. package/dist/cjs/modules/index.js.map +1 -0
  38. package/dist/cjs/modules/indexing.js +375 -0
  39. package/dist/cjs/modules/indexing.js.map +1 -0
  40. package/dist/cjs/modules/ledger.js +234 -0
  41. package/dist/cjs/modules/ledger.js.map +1 -0
  42. package/dist/cjs/modules/tools.js +319 -0
  43. package/dist/cjs/modules/tools.js.map +1 -0
  44. package/dist/cjs/modules/vault.js +410 -0
  45. package/dist/cjs/modules/vault.js.map +1 -0
  46. package/dist/cjs/pda/index.js +377 -0
  47. package/dist/cjs/pda/index.js.map +1 -0
  48. package/dist/cjs/plugin/index.js +934 -0
  49. package/dist/cjs/plugin/index.js.map +1 -0
  50. package/dist/cjs/plugin/protocols.js +282 -0
  51. package/dist/cjs/plugin/protocols.js.map +1 -0
  52. package/dist/cjs/plugin/schemas.js +831 -0
  53. package/dist/cjs/plugin/schemas.js.map +1 -0
  54. package/dist/cjs/postgres/adapter.js +715 -0
  55. package/dist/cjs/postgres/adapter.js.map +1 -0
  56. package/dist/cjs/postgres/index.js +50 -0
  57. package/dist/cjs/postgres/index.js.map +1 -0
  58. package/dist/cjs/postgres/serializers.js +381 -0
  59. package/dist/cjs/postgres/serializers.js.map +1 -0
  60. package/dist/cjs/postgres/sync.js +221 -0
  61. package/dist/cjs/postgres/sync.js.map +1 -0
  62. package/dist/cjs/postgres/types.js +44 -0
  63. package/dist/cjs/postgres/types.js.map +1 -0
  64. package/dist/cjs/registries/builder.js +414 -0
  65. package/dist/cjs/registries/builder.js.map +1 -0
  66. package/dist/cjs/registries/discovery.js +362 -0
  67. package/dist/cjs/registries/discovery.js.map +1 -0
  68. package/dist/cjs/registries/index.js +51 -0
  69. package/dist/cjs/registries/index.js.map +1 -0
  70. package/dist/cjs/registries/session.js +433 -0
  71. package/dist/cjs/registries/session.js.map +1 -0
  72. package/dist/cjs/registries/x402.js +577 -0
  73. package/dist/cjs/registries/x402.js.map +1 -0
  74. package/dist/cjs/types/accounts.js +13 -0
  75. package/dist/cjs/types/accounts.js.map +1 -0
  76. package/dist/cjs/types/common.js +13 -0
  77. package/dist/cjs/types/common.js.map +1 -0
  78. package/dist/cjs/types/enums.js +174 -0
  79. package/dist/cjs/types/enums.js.map +1 -0
  80. package/dist/cjs/types/index.js +36 -0
  81. package/dist/cjs/types/index.js.map +1 -0
  82. package/dist/cjs/types/instructions.js +92 -0
  83. package/dist/cjs/types/instructions.js.map +1 -0
  84. package/dist/cjs/utils/hash.js +58 -0
  85. package/dist/cjs/utils/hash.js.map +1 -0
  86. package/dist/cjs/utils/index.js +27 -0
  87. package/dist/cjs/utils/index.js.map +1 -0
  88. package/dist/cjs/utils/serialization.js +105 -0
  89. package/dist/cjs/utils/serialization.js.map +1 -0
  90. package/dist/cjs/utils/validation.js +36 -0
  91. package/dist/cjs/utils/validation.js.map +1 -0
  92. package/dist/esm/constants/index.js +29 -0
  93. package/dist/esm/constants/index.js.map +1 -0
  94. package/dist/esm/constants/limits.js +158 -0
  95. package/dist/esm/constants/limits.js.map +1 -0
  96. package/dist/esm/constants/programs.js +75 -0
  97. package/dist/esm/constants/programs.js.map +1 -0
  98. package/dist/esm/constants/seeds.js +54 -0
  99. package/dist/esm/constants/seeds.js.map +1 -0
  100. package/dist/esm/core/client.js +384 -0
  101. package/dist/esm/core/client.js.map +1 -0
  102. package/dist/esm/core/connection.js +315 -0
  103. package/dist/esm/core/connection.js.map +1 -0
  104. package/dist/esm/core/index.js +19 -0
  105. package/dist/esm/core/index.js.map +1 -0
  106. package/dist/esm/errors/index.js +325 -0
  107. package/dist/esm/errors/index.js.map +1 -0
  108. package/dist/esm/events/index.js +132 -0
  109. package/dist/esm/events/index.js.map +1 -0
  110. package/dist/esm/idl/index.js +57 -0
  111. package/dist/esm/idl/index.js.map +1 -0
  112. package/dist/esm/idl/synapse_agent_sap.json +9710 -0
  113. package/dist/esm/index.js +70 -0
  114. package/dist/esm/index.js.map +1 -0
  115. package/dist/esm/modules/agent.js +268 -0
  116. package/dist/esm/modules/agent.js.map +1 -0
  117. package/dist/esm/modules/attestation.js +143 -0
  118. package/dist/esm/modules/attestation.js.map +1 -0
  119. package/dist/esm/modules/base.js +124 -0
  120. package/dist/esm/modules/base.js.map +1 -0
  121. package/dist/esm/modules/escrow.js +242 -0
  122. package/dist/esm/modules/escrow.js.map +1 -0
  123. package/dist/esm/modules/feedback.js +162 -0
  124. package/dist/esm/modules/feedback.js.map +1 -0
  125. package/dist/esm/modules/index.js +23 -0
  126. package/dist/esm/modules/index.js.map +1 -0
  127. package/dist/esm/modules/indexing.js +371 -0
  128. package/dist/esm/modules/indexing.js.map +1 -0
  129. package/dist/esm/modules/ledger.js +230 -0
  130. package/dist/esm/modules/ledger.js.map +1 -0
  131. package/dist/esm/modules/tools.js +315 -0
  132. package/dist/esm/modules/tools.js.map +1 -0
  133. package/dist/esm/modules/vault.js +406 -0
  134. package/dist/esm/modules/vault.js.map +1 -0
  135. package/dist/esm/pda/index.js +357 -0
  136. package/dist/esm/pda/index.js.map +1 -0
  137. package/dist/esm/plugin/index.js +927 -0
  138. package/dist/esm/plugin/index.js.map +1 -0
  139. package/dist/esm/plugin/protocols.js +279 -0
  140. package/dist/esm/plugin/protocols.js.map +1 -0
  141. package/dist/esm/plugin/schemas.js +828 -0
  142. package/dist/esm/plugin/schemas.js.map +1 -0
  143. package/dist/esm/postgres/adapter.js +678 -0
  144. package/dist/esm/postgres/adapter.js.map +1 -0
  145. package/dist/esm/postgres/index.js +27 -0
  146. package/dist/esm/postgres/index.js.map +1 -0
  147. package/dist/esm/postgres/serializers.js +362 -0
  148. package/dist/esm/postgres/serializers.js.map +1 -0
  149. package/dist/esm/postgres/sync.js +217 -0
  150. package/dist/esm/postgres/sync.js.map +1 -0
  151. package/dist/esm/postgres/types.js +41 -0
  152. package/dist/esm/postgres/types.js.map +1 -0
  153. package/dist/esm/registries/builder.js +410 -0
  154. package/dist/esm/registries/builder.js.map +1 -0
  155. package/dist/esm/registries/discovery.js +358 -0
  156. package/dist/esm/registries/discovery.js.map +1 -0
  157. package/dist/esm/registries/index.js +44 -0
  158. package/dist/esm/registries/index.js.map +1 -0
  159. package/dist/esm/registries/session.js +429 -0
  160. package/dist/esm/registries/session.js.map +1 -0
  161. package/dist/esm/registries/x402.js +573 -0
  162. package/dist/esm/registries/x402.js.map +1 -0
  163. package/dist/esm/types/accounts.js +12 -0
  164. package/dist/esm/types/accounts.js.map +1 -0
  165. package/dist/esm/types/common.js +12 -0
  166. package/dist/esm/types/common.js.map +1 -0
  167. package/dist/esm/types/enums.js +171 -0
  168. package/dist/esm/types/enums.js.map +1 -0
  169. package/dist/esm/types/index.js +25 -0
  170. package/dist/esm/types/index.js.map +1 -0
  171. package/dist/esm/types/instructions.js +89 -0
  172. package/dist/esm/types/instructions.js.map +1 -0
  173. package/dist/esm/utils/hash.js +53 -0
  174. package/dist/esm/utils/hash.js.map +1 -0
  175. package/dist/esm/utils/index.js +19 -0
  176. package/dist/esm/utils/index.js.map +1 -0
  177. package/dist/esm/utils/serialization.js +98 -0
  178. package/dist/esm/utils/serialization.js.map +1 -0
  179. package/dist/esm/utils/validation.js +33 -0
  180. package/dist/esm/utils/validation.js.map +1 -0
  181. package/dist/types/constants/index.d.ts +27 -0
  182. package/dist/types/constants/index.d.ts.map +1 -0
  183. package/dist/types/constants/limits.d.ts +149 -0
  184. package/dist/types/constants/limits.d.ts.map +1 -0
  185. package/dist/types/constants/programs.d.ts +69 -0
  186. package/dist/types/constants/programs.d.ts.map +1 -0
  187. package/dist/types/constants/seeds.d.ts +61 -0
  188. package/dist/types/constants/seeds.d.ts.map +1 -0
  189. package/dist/types/core/client.d.ts +323 -0
  190. package/dist/types/core/client.d.ts.map +1 -0
  191. package/dist/types/core/connection.d.ts +279 -0
  192. package/dist/types/core/connection.d.ts.map +1 -0
  193. package/dist/types/core/index.d.ts +20 -0
  194. package/dist/types/core/index.d.ts.map +1 -0
  195. package/dist/types/errors/index.d.ts +276 -0
  196. package/dist/types/errors/index.d.ts.map +1 -0
  197. package/dist/types/events/index.d.ts +248 -0
  198. package/dist/types/events/index.d.ts.map +1 -0
  199. package/dist/types/idl/index.d.ts +70 -0
  200. package/dist/types/idl/index.d.ts.map +1 -0
  201. package/dist/types/index.d.ts +68 -0
  202. package/dist/types/index.d.ts.map +1 -0
  203. package/dist/types/modules/agent.d.ts +166 -0
  204. package/dist/types/modules/agent.d.ts.map +1 -0
  205. package/dist/types/modules/attestation.d.ts +96 -0
  206. package/dist/types/modules/attestation.d.ts.map +1 -0
  207. package/dist/types/modules/base.d.ts +126 -0
  208. package/dist/types/modules/base.d.ts.map +1 -0
  209. package/dist/types/modules/escrow.d.ts +151 -0
  210. package/dist/types/modules/escrow.d.ts.map +1 -0
  211. package/dist/types/modules/feedback.d.ts +105 -0
  212. package/dist/types/modules/feedback.d.ts.map +1 -0
  213. package/dist/types/modules/index.d.ts +24 -0
  214. package/dist/types/modules/index.d.ts.map +1 -0
  215. package/dist/types/modules/indexing.d.ts +200 -0
  216. package/dist/types/modules/indexing.d.ts.map +1 -0
  217. package/dist/types/modules/ledger.d.ts +150 -0
  218. package/dist/types/modules/ledger.d.ts.map +1 -0
  219. package/dist/types/modules/tools.d.ts +182 -0
  220. package/dist/types/modules/tools.d.ts.map +1 -0
  221. package/dist/types/modules/vault.d.ts +240 -0
  222. package/dist/types/modules/vault.d.ts.map +1 -0
  223. package/dist/types/pda/index.d.ts +296 -0
  224. package/dist/types/pda/index.d.ts.map +1 -0
  225. package/dist/types/plugin/index.d.ts +171 -0
  226. package/dist/types/plugin/index.d.ts.map +1 -0
  227. package/dist/types/plugin/protocols.d.ts +152 -0
  228. package/dist/types/plugin/protocols.d.ts.map +1 -0
  229. package/dist/types/plugin/schemas.d.ts +823 -0
  230. package/dist/types/plugin/schemas.d.ts.map +1 -0
  231. package/dist/types/postgres/adapter.d.ts +355 -0
  232. package/dist/types/postgres/adapter.d.ts.map +1 -0
  233. package/dist/types/postgres/index.d.ts +24 -0
  234. package/dist/types/postgres/index.d.ts.map +1 -0
  235. package/dist/types/postgres/serializers.d.ts +30 -0
  236. package/dist/types/postgres/serializers.d.ts.map +1 -0
  237. package/dist/types/postgres/sync.d.ts +132 -0
  238. package/dist/types/postgres/sync.d.ts.map +1 -0
  239. package/dist/types/postgres/types.d.ts +167 -0
  240. package/dist/types/postgres/types.d.ts.map +1 -0
  241. package/dist/types/registries/builder.d.ts +340 -0
  242. package/dist/types/registries/builder.d.ts.map +1 -0
  243. package/dist/types/registries/discovery.d.ts +333 -0
  244. package/dist/types/registries/discovery.d.ts.map +1 -0
  245. package/dist/types/registries/index.d.ts +48 -0
  246. package/dist/types/registries/index.d.ts.map +1 -0
  247. package/dist/types/registries/session.d.ts +323 -0
  248. package/dist/types/registries/session.d.ts.map +1 -0
  249. package/dist/types/registries/x402.d.ts +463 -0
  250. package/dist/types/registries/x402.d.ts.map +1 -0
  251. package/dist/types/types/accounts.d.ts +565 -0
  252. package/dist/types/types/accounts.d.ts.map +1 -0
  253. package/dist/types/types/common.d.ts +166 -0
  254. package/dist/types/types/common.d.ts.map +1 -0
  255. package/dist/types/types/enums.d.ts +238 -0
  256. package/dist/types/types/enums.d.ts.map +1 -0
  257. package/dist/types/types/index.d.ts +28 -0
  258. package/dist/types/types/index.d.ts.map +1 -0
  259. package/dist/types/types/instructions.d.ts +366 -0
  260. package/dist/types/types/instructions.d.ts.map +1 -0
  261. package/dist/types/utils/hash.d.ts +48 -0
  262. package/dist/types/utils/hash.d.ts.map +1 -0
  263. package/dist/types/utils/index.d.ts +19 -0
  264. package/dist/types/utils/index.d.ts.map +1 -0
  265. package/dist/types/utils/serialization.d.ts +69 -0
  266. package/dist/types/utils/serialization.d.ts.map +1 -0
  267. package/dist/types/utils/validation.d.ts +29 -0
  268. package/dist/types/utils/validation.d.ts.map +1 -0
  269. package/package.json +178 -0
  270. package/src/constants/index.ts +44 -0
  271. package/src/constants/limits.ts +165 -0
  272. package/src/constants/programs.ts +83 -0
  273. package/src/constants/seeds.ts +66 -0
  274. package/src/core/client.ts +416 -0
  275. package/src/core/connection.ts +409 -0
  276. package/src/core/index.ts +20 -0
  277. package/src/errors/index.ts +346 -0
  278. package/src/events/index.ts +335 -0
  279. package/src/idl/index.ts +76 -0
  280. package/src/idl/synapse_agent_sap.json +9710 -0
  281. package/src/index.ts +253 -0
  282. package/src/modules/agent.ts +319 -0
  283. package/src/modules/attestation.ts +168 -0
  284. package/src/modules/base.ts +158 -0
  285. package/src/modules/escrow.ts +308 -0
  286. package/src/modules/feedback.ts +186 -0
  287. package/src/modules/index.ts +24 -0
  288. package/src/modules/indexing.ts +444 -0
  289. package/src/modules/ledger.ts +262 -0
  290. package/src/modules/tools.ts +411 -0
  291. package/src/modules/vault.ts +533 -0
  292. package/src/pda/index.ts +512 -0
  293. package/src/plugin/index.ts +1202 -0
  294. package/src/plugin/protocols.ts +404 -0
  295. package/src/plugin/schemas.ts +909 -0
  296. package/src/postgres/adapter.ts +904 -0
  297. package/src/postgres/index.ts +59 -0
  298. package/src/postgres/schema.sql +683 -0
  299. package/src/postgres/serializers.ts +485 -0
  300. package/src/postgres/sync.ts +254 -0
  301. package/src/postgres/types.ts +245 -0
  302. package/src/registries/builder.ts +607 -0
  303. package/src/registries/discovery.ts +572 -0
  304. package/src/registries/index.ts +77 -0
  305. package/src/registries/session.ts +613 -0
  306. package/src/registries/x402.ts +906 -0
  307. package/src/types/accounts.ts +618 -0
  308. package/src/types/common.ts +187 -0
  309. package/src/types/enums.ts +214 -0
  310. package/src/types/index.ts +92 -0
  311. package/src/types/instructions.ts +413 -0
  312. package/src/utils/hash.ts +57 -0
  313. package/src/utils/index.ts +19 -0
  314. package/src/utils/serialization.ts +98 -0
  315. package/src/utils/validation.ts +36 -0
@@ -0,0 +1,409 @@
1
+ /**
2
+ * @module core/connection
3
+ * @description RPC connection factory for SAP v2 SDK.
4
+ *
5
+ * Provides a high-level, synapse-client-sdk–compatible entry point
6
+ * for creating {@link SapClient} instances from an RPC URL and wallet.
7
+ *
8
+ * @category Core
9
+ * @since v0.1.0
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { SapConnection } from "@synapse-sap/sdk";
14
+ *
15
+ * // Quick start — RPC URL + Keypair
16
+ * const sap = SapConnection.fromKeypair("https://api.devnet.solana.com", keypair);
17
+ * const agent = await sap.client.agent.fetch();
18
+ *
19
+ * // Or build step-by-step
20
+ * const conn = new SapConnection({
21
+ * rpcUrl: "https://us-1-mainnet.oobeprotocol.ai/rpc?api_key=xxx",
22
+ * cluster: "mainnet-beta",
23
+ * commitment: "confirmed",
24
+ * });
25
+ * const client = conn.createClient(wallet);
26
+ * ```
27
+ */
28
+
29
+ import {
30
+ Connection,
31
+ type Commitment,
32
+ Keypair,
33
+ type PublicKey,
34
+ LAMPORTS_PER_SOL,
35
+ } from "@solana/web3.js";
36
+ import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
37
+ import {
38
+ SAP_PROGRAM_ID,
39
+ MAINNET_SAP_PROGRAM_ID,
40
+ DEVNET_SAP_PROGRAM_ID,
41
+ LOCALNET_SAP_PROGRAM_ID,
42
+ } from "../constants";
43
+ import { SapClient } from "./client";
44
+
45
+ // ═══════════════════════════════════════════════════════════════════
46
+ // Types
47
+ // ═══════════════════════════════════════════════════════════════════
48
+
49
+ /**
50
+ * @name SapCluster
51
+ * @description Supported Solana cluster names used to select the RPC endpoint
52
+ * and corresponding SAP program ID.
53
+ * @category Core
54
+ * @since v0.1.0
55
+ */
56
+ export type SapCluster = "mainnet-beta" | "devnet" | "localnet";
57
+
58
+ /**
59
+ * @interface SapConnectionConfig
60
+ * @description Configuration object used to initialise a {@link SapConnection}.
61
+ * @category Core
62
+ * @since v0.1.0
63
+ * @see {@link SapConnection}
64
+ */
65
+ export interface SapConnectionConfig {
66
+ /**
67
+ * @property {string} rpcUrl
68
+ * @description Solana JSON-RPC endpoint URL (e.g. `https://api.devnet.solana.com`).
69
+ */
70
+ rpcUrl: string;
71
+
72
+ /**
73
+ * @property {string} [wsUrl]
74
+ * @description WebSocket endpoint URL. When omitted the SDK derives it
75
+ * automatically from {@link rpcUrl} by swapping the protocol scheme.
76
+ */
77
+ wsUrl?: string;
78
+
79
+ /**
80
+ * @property {Commitment} [commitment]
81
+ * @description Commitment level for queries and transaction confirmations.
82
+ * Defaults to `"confirmed"` when not provided.
83
+ */
84
+ commitment?: Commitment;
85
+
86
+ /**
87
+ * @property {SapCluster} [cluster]
88
+ * @description Cluster hint (`mainnet-beta` | `devnet` | `localnet`).
89
+ * When omitted the SDK infers it from {@link rpcUrl} via
90
+ * {@link SapConnection.detectCluster}.
91
+ */
92
+ cluster?: SapCluster;
93
+ }
94
+
95
+ // ═══════════════════════════════════════════════════════════════════
96
+ // Implementation
97
+ // ═══════════════════════════════════════════════════════════════════
98
+
99
+ /**
100
+ * @name SapConnection
101
+ * @description Lightweight RPC connection wrapper that creates
102
+ * properly-configured {@link SapClient} instances.
103
+ *
104
+ * Compatible with the `synapse-client-sdk` connection model:
105
+ * start from an RPC URL, attach a wallet, get a typed client.
106
+ *
107
+ * @category Core
108
+ * @since v0.1.0
109
+ * @see {@link SapClient}
110
+ * @see {@link SapConnectionConfig}
111
+ *
112
+ * @example
113
+ * ```ts
114
+ * // Factory shortcut for devnet
115
+ * const conn = SapConnection.devnet();
116
+ * const client = conn.createClient(wallet);
117
+ *
118
+ * // One-liner with Keypair
119
+ * const { client } = SapConnection.fromKeypair(
120
+ * "https://api.devnet.solana.com",
121
+ * keypair,
122
+ * );
123
+ * ```
124
+ */
125
+ export class SapConnection {
126
+ /**
127
+ * @readonly
128
+ * @description Raw Solana {@link Connection}. Exposed for advanced
129
+ * use-cases that need direct RPC access.
130
+ */
131
+ readonly connection: Connection;
132
+
133
+ /**
134
+ * @readonly
135
+ * @description The resolved Solana cluster for this connection,
136
+ * either explicitly provided or auto-detected from the RPC URL.
137
+ */
138
+ readonly cluster: SapCluster;
139
+
140
+ /**
141
+ * @readonly
142
+ * @description Commitment level used for all queries and
143
+ * transaction confirmations on this connection.
144
+ */
145
+ readonly commitment: Commitment;
146
+
147
+ /**
148
+ * @readonly
149
+ * @description The SAP on-chain program {@link PublicKey} resolved
150
+ * for the current {@link cluster}.
151
+ * @see {@link SapConnection.programIdForCluster}
152
+ */
153
+ readonly programId: PublicKey;
154
+
155
+ constructor(config: SapConnectionConfig) {
156
+ this.commitment = config.commitment ?? "confirmed";
157
+ this.cluster = config.cluster ?? SapConnection.detectCluster(config.rpcUrl);
158
+ this.programId = SapConnection.programIdForCluster(this.cluster);
159
+
160
+ this.connection = new Connection(config.rpcUrl, {
161
+ commitment: this.commitment,
162
+ wsEndpoint: config.wsUrl,
163
+ });
164
+ }
165
+
166
+ // ─────────────────────────────────────────────
167
+ // Factory helpers
168
+ // ─────────────────────────────────────────────
169
+
170
+ /**
171
+ * Create a {@link SapConnection} for **devnet** with sensible defaults.
172
+ *
173
+ * @static
174
+ * @param {Commitment} [commitment="confirmed"] — Commitment level.
175
+ * @returns {SapConnection} A connection targeting Solana devnet.
176
+ * @since v0.1.0
177
+ *
178
+ * @example
179
+ * ```ts
180
+ * const conn = SapConnection.devnet();
181
+ * ```
182
+ */
183
+ static devnet(commitment: Commitment = "confirmed"): SapConnection {
184
+ return new SapConnection({
185
+ rpcUrl: "https://api.devnet.solana.com",
186
+ cluster: "devnet",
187
+ commitment,
188
+ });
189
+ }
190
+
191
+ /**
192
+ * Create a {@link SapConnection} for **mainnet-beta** with sensible defaults.
193
+ *
194
+ * @static
195
+ * @param {string} [rpcUrl="https://api.mainnet-beta.solana.com"] — Custom RPC URL.
196
+ * @param {Commitment} [commitment="confirmed"] — Commitment level.
197
+ * @returns {SapConnection} A connection targeting Solana mainnet-beta.
198
+ * @since v0.1.0
199
+ *
200
+ * @example
201
+ * ```ts
202
+ * const conn = SapConnection.mainnet("https://my-rpc.example.com");
203
+ * ```
204
+ */
205
+ static mainnet(
206
+ rpcUrl = "https://api.mainnet-beta.solana.com",
207
+ commitment: Commitment = "confirmed",
208
+ ): SapConnection {
209
+ return new SapConnection({ rpcUrl, cluster: "mainnet-beta", commitment });
210
+ }
211
+
212
+ /**
213
+ * Create a {@link SapConnection} for **localnet** (`localhost:8899`).
214
+ *
215
+ * @static
216
+ * @param {Commitment} [commitment="confirmed"] — Commitment level.
217
+ * @returns {SapConnection} A connection targeting a local validator.
218
+ * @since v0.1.0
219
+ *
220
+ * @example
221
+ * ```ts
222
+ * const conn = SapConnection.localnet();
223
+ * ```
224
+ */
225
+ static localnet(commitment: Commitment = "confirmed"): SapConnection {
226
+ return new SapConnection({
227
+ rpcUrl: "http://localhost:8899",
228
+ cluster: "localnet",
229
+ commitment,
230
+ });
231
+ }
232
+
233
+ /**
234
+ * One-liner: create a {@link SapConnection} + {@link SapClient} from
235
+ * an RPC URL and a `Keypair`. Perfect for scripts and CLI tools.
236
+ *
237
+ * @static
238
+ * @param {string} rpcUrl — Solana JSON-RPC endpoint.
239
+ * @param {Keypair} keypair — Signer keypair.
240
+ * @param {object} [opts] — Optional overrides.
241
+ * @param {Commitment} [opts.commitment] — Commitment level.
242
+ * @param {SapCluster} [opts.cluster] — Explicit cluster hint.
243
+ * @returns {SapConnection & { readonly client: SapClient }} Connection with an attached client.
244
+ * @since v0.1.0
245
+ *
246
+ * @example
247
+ * ```ts
248
+ * const { client, connection } = SapConnection.fromKeypair(
249
+ * "https://api.devnet.solana.com",
250
+ * Keypair.generate(),
251
+ * );
252
+ * ```
253
+ */
254
+ static fromKeypair(
255
+ rpcUrl: string,
256
+ keypair: Keypair,
257
+ opts?: { commitment?: Commitment; cluster?: SapCluster },
258
+ ): SapConnection & { readonly client: SapClient } {
259
+ const conn = new SapConnection({
260
+ rpcUrl,
261
+ commitment: opts?.commitment,
262
+ cluster: opts?.cluster,
263
+ });
264
+ const client = conn.createClient(new Wallet(keypair));
265
+ return Object.assign(conn, { client });
266
+ }
267
+
268
+ // ─────────────────────────────────────────────
269
+ // Client creation
270
+ // ─────────────────────────────────────────────
271
+
272
+ /**
273
+ * Create a {@link SapClient} from an Anchor {@link Wallet} (signer).
274
+ *
275
+ * @param {Wallet} wallet — An Anchor-compatible wallet/signer.
276
+ * @returns {SapClient} A fully-configured SAP client.
277
+ * @since v0.1.0
278
+ *
279
+ * @example
280
+ * ```ts
281
+ * const client = conn.createClient(new Wallet(keypair));
282
+ * ```
283
+ */
284
+ createClient(wallet: Wallet): SapClient {
285
+ const provider = new AnchorProvider(this.connection, wallet, {
286
+ commitment: this.commitment,
287
+ });
288
+ return SapClient.from(provider, this.programId);
289
+ }
290
+
291
+ /**
292
+ * Create a {@link SapClient} from a raw {@link Keypair}.
293
+ *
294
+ * @param {Keypair} keypair — The signer keypair.
295
+ * @returns {SapClient} A fully-configured SAP client.
296
+ * @since v0.1.0
297
+ *
298
+ * @example
299
+ * ```ts
300
+ * const client = conn.fromKeypair(Keypair.generate());
301
+ * ```
302
+ */
303
+ fromKeypair(keypair: Keypair): SapClient {
304
+ return this.createClient(new Wallet(keypair));
305
+ }
306
+
307
+ // ─────────────────────────────────────────────
308
+ // Utility methods
309
+ // ─────────────────────────────────────────────
310
+
311
+ /**
312
+ * Request an airdrop (devnet / localnet only).
313
+ *
314
+ * @param {PublicKey} to — Recipient public key.
315
+ * @param {number} solAmount — Amount of SOL to airdrop.
316
+ * @returns {Promise<string>} The confirmed transaction signature.
317
+ * @throws {Error} If the airdrop request or confirmation fails (e.g. on mainnet).
318
+ * @since v0.1.0
319
+ *
320
+ * @example
321
+ * ```ts
322
+ * const sig = await conn.airdrop(wallet.publicKey, 2);
323
+ * ```
324
+ */
325
+ async airdrop(to: PublicKey, solAmount: number): Promise<string> {
326
+ const sig = await this.connection.requestAirdrop(
327
+ to,
328
+ solAmount * LAMPORTS_PER_SOL,
329
+ );
330
+ await this.connection.confirmTransaction(sig, this.commitment);
331
+ return sig;
332
+ }
333
+
334
+ /**
335
+ * Get the SOL balance of an address in **lamports**.
336
+ *
337
+ * @param {PublicKey} address — The account to query.
338
+ * @returns {Promise<number>} Balance in lamports.
339
+ * @since v0.1.0
340
+ */
341
+ async getBalance(address: PublicKey): Promise<number> {
342
+ return this.connection.getBalance(address, this.commitment);
343
+ }
344
+
345
+ /**
346
+ * Get the SOL balance of an address in **SOL** (human-readable).
347
+ *
348
+ * @param {PublicKey} address — The account to query.
349
+ * @returns {Promise<number>} Balance in SOL.
350
+ * @since v0.1.0
351
+ *
352
+ * @example
353
+ * ```ts
354
+ * const sol = await conn.getBalanceSol(wallet.publicKey);
355
+ * console.log(`Balance: ${sol} SOL`);
356
+ * ```
357
+ */
358
+ async getBalanceSol(address: PublicKey): Promise<number> {
359
+ const lamports = await this.getBalance(address);
360
+ return lamports / LAMPORTS_PER_SOL;
361
+ }
362
+
363
+ // ─────────────────────────────────────────────
364
+ // Internal helpers
365
+ // ─────────────────────────────────────────────
366
+
367
+ /**
368
+ * Infer the {@link SapCluster} from an RPC URL by inspecting
369
+ * well-known substrings (`devnet`, `localhost`, `:8899`).
370
+ *
371
+ * @static
372
+ * @param {string} rpcUrl — The RPC endpoint to inspect.
373
+ * @returns {SapCluster} The detected cluster, defaulting to `"mainnet-beta"`.
374
+ * @since v0.1.0
375
+ */
376
+ static detectCluster(rpcUrl: string): SapCluster {
377
+ const lower = rpcUrl.toLowerCase();
378
+ if (lower.includes("devnet")) return "devnet";
379
+ if (
380
+ lower.includes("localhost") ||
381
+ lower.includes("127.0.0.1") ||
382
+ lower.includes(":8899")
383
+ )
384
+ return "localnet";
385
+ return "mainnet-beta";
386
+ }
387
+
388
+ /**
389
+ * Map a {@link SapCluster} to the canonical SAP on-chain program ID.
390
+ *
391
+ * @static
392
+ * @param {SapCluster} cluster — Target cluster.
393
+ * @returns {PublicKey} The program {@link PublicKey} for the given cluster.
394
+ * @since v0.1.0
395
+ * @see {@link SAP_PROGRAM_ID}
396
+ */
397
+ static programIdForCluster(cluster: SapCluster): PublicKey {
398
+ switch (cluster) {
399
+ case "mainnet-beta":
400
+ return MAINNET_SAP_PROGRAM_ID;
401
+ case "devnet":
402
+ return DEVNET_SAP_PROGRAM_ID;
403
+ case "localnet":
404
+ return LOCALNET_SAP_PROGRAM_ID;
405
+ default:
406
+ return SAP_PROGRAM_ID;
407
+ }
408
+ }
409
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @module core
3
+ * @description Core infrastructure — client creation and RPC connection.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { SapClient, SapConnection } from "@synapse-sap/sdk";
8
+ *
9
+ * // From Anchor provider
10
+ * const client = SapClient.from(provider);
11
+ *
12
+ * // From RPC URL + keypair (synapse-client-sdk compatible)
13
+ * const conn = SapConnection.devnet();
14
+ * const client2 = conn.fromKeypair(keypair);
15
+ * ```
16
+ */
17
+
18
+ export { SapClient } from "./client";
19
+ export { SapConnection } from "./connection";
20
+ export type { SapCluster, SapConnectionConfig } from "./connection";