@veilo/sdk-core 0.5.0 → 0.7.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 (240) hide show
  1. package/README.md +282 -18
  2. package/accounts.d.ts +2 -0
  3. package/accounts.js +3 -0
  4. package/cloak.d.ts +2 -0
  5. package/cloak.js +3 -0
  6. package/config.d.ts +2 -0
  7. package/config.js +3 -0
  8. package/dist/cjs/events/index.d.ts +6 -0
  9. package/dist/cjs/events/index.js +22 -0
  10. package/dist/cjs/events/parsing.d.ts +25 -0
  11. package/dist/cjs/events/parsing.js +158 -0
  12. package/dist/cjs/events/position.d.ts +26 -0
  13. package/dist/cjs/events/position.js +53 -0
  14. package/dist/cjs/events/recovery.d.ts +87 -0
  15. package/dist/cjs/events/recovery.js +281 -0
  16. package/dist/cjs/events/scanning.d.ts +35 -0
  17. package/dist/cjs/events/scanning.js +98 -0
  18. package/dist/cjs/events/tree.d.ts +27 -0
  19. package/dist/cjs/events/tree.js +63 -0
  20. package/dist/cjs/events/types.d.ts +39 -0
  21. package/dist/cjs/events/types.js +2 -0
  22. package/dist/cjs/events.d.ts +1 -77
  23. package/dist/cjs/events.js +6 -154
  24. package/dist/cjs/identity/encoding.d.ts +9 -0
  25. package/dist/cjs/identity/encoding.js +85 -0
  26. package/dist/cjs/identity/index.d.ts +4 -0
  27. package/dist/cjs/identity/index.js +20 -0
  28. package/dist/cjs/identity/noteKey.d.ts +33 -0
  29. package/dist/cjs/identity/noteKey.js +97 -0
  30. package/dist/cjs/identity/spending.d.ts +18 -0
  31. package/dist/cjs/identity/spending.js +46 -0
  32. package/dist/cjs/identity/viewKey.d.ts +38 -0
  33. package/dist/cjs/identity/viewKey.js +105 -0
  34. package/dist/cjs/idl/index.d.ts +18 -0
  35. package/dist/cjs/idl/index.js +24 -0
  36. package/dist/cjs/idl/privacy_pool.json +9907 -9907
  37. package/dist/cjs/idl/privacy_pool_legacy.d.ts +5 -0
  38. package/dist/cjs/idl/privacy_pool_legacy.js +3307 -0
  39. package/dist/cjs/idl/privacy_pool_legacy.json +2302 -0
  40. package/dist/cjs/idl/privacy_pool_legacy2.d.ts +5 -0
  41. package/dist/cjs/idl/privacy_pool_legacy2.js +3397 -0
  42. package/dist/cjs/idl/privacy_pool_legacy2.json +2376 -0
  43. package/dist/cjs/index.d.ts +8 -3
  44. package/dist/cjs/index.js +12 -2
  45. package/dist/cjs/notes/amount.d.ts +2 -0
  46. package/dist/cjs/notes/amount.js +21 -0
  47. package/dist/cjs/notes/index.d.ts +4 -0
  48. package/dist/cjs/notes/index.js +4 -0
  49. package/dist/cjs/notes/recovery.d.ts +16 -6
  50. package/dist/cjs/notes/recovery.js +33 -16
  51. package/dist/cjs/notes/scan.d.ts +74 -0
  52. package/dist/cjs/notes/scan.js +110 -0
  53. package/dist/cjs/notes/selection.d.ts +133 -0
  54. package/dist/cjs/notes/selection.js +260 -0
  55. package/dist/cjs/notes/spent.d.ts +60 -0
  56. package/dist/cjs/notes/spent.js +101 -0
  57. package/dist/cjs/perps/constants.d.ts +16 -0
  58. package/dist/cjs/perps/constants.js +52 -0
  59. package/dist/cjs/perps/index.d.ts +5 -0
  60. package/dist/cjs/perps/index.js +21 -0
  61. package/dist/cjs/perps/keys.d.ts +16 -0
  62. package/dist/cjs/perps/keys.js +43 -0
  63. package/dist/cjs/perps/pdas.d.ts +29 -0
  64. package/dist/cjs/perps/pdas.js +55 -0
  65. package/dist/cjs/perps/relayer.d.ts +9 -0
  66. package/dist/cjs/perps/relayer.js +35 -0
  67. package/dist/cjs/perps/types.d.ts +126 -0
  68. package/dist/cjs/perps/types.js +2 -0
  69. package/dist/cjs/positions/index.d.ts +4 -0
  70. package/dist/cjs/positions/index.js +20 -0
  71. package/dist/cjs/positions/keys.d.ts +29 -0
  72. package/dist/cjs/positions/keys.js +71 -0
  73. package/dist/cjs/positions/pdas.d.ts +15 -0
  74. package/dist/cjs/positions/pdas.js +54 -0
  75. package/dist/cjs/positions/relayer.d.ts +4 -0
  76. package/dist/cjs/positions/relayer.js +15 -0
  77. package/dist/cjs/positions/types.d.ts +97 -0
  78. package/dist/cjs/positions/types.js +2 -0
  79. package/dist/cjs/predictions/client.d.ts +41 -0
  80. package/dist/cjs/predictions/client.js +147 -0
  81. package/dist/cjs/predictions/index.d.ts +5 -0
  82. package/dist/cjs/predictions/index.js +21 -0
  83. package/dist/cjs/predictions/keys.d.ts +14 -0
  84. package/dist/cjs/predictions/keys.js +40 -0
  85. package/dist/cjs/predictions/pdas.d.ts +6 -0
  86. package/dist/cjs/predictions/pdas.js +13 -0
  87. package/dist/cjs/predictions/relayer.d.ts +3 -0
  88. package/dist/cjs/predictions/relayer.js +11 -0
  89. package/dist/cjs/predictions/types.d.ts +178 -0
  90. package/dist/cjs/predictions/types.js +2 -0
  91. package/dist/cjs/program.d.ts +2 -0
  92. package/dist/cjs/program.js +8 -7
  93. package/dist/cjs/prover.d.ts +27 -4
  94. package/dist/cjs/prover.js +107 -48
  95. package/dist/cjs/relayer/api.d.ts +41 -0
  96. package/dist/cjs/relayer/api.js +99 -0
  97. package/dist/cjs/relayer/client.d.ts +42 -17
  98. package/dist/cjs/relayer/client.js +94 -17
  99. package/dist/cjs/relayer/errors.d.ts +1 -1
  100. package/dist/cjs/relayer/errors.js +1 -1
  101. package/dist/cjs/relayer/index.d.ts +4 -1
  102. package/dist/cjs/relayer/index.js +1 -1
  103. package/dist/cjs/relayer/internal-config.d.ts +36 -0
  104. package/dist/cjs/relayer/internal-config.js +9 -0
  105. package/dist/cjs/relayer/internal.d.ts +6 -0
  106. package/dist/cjs/relayer/internal.js +14 -0
  107. package/dist/cjs/relayer/transport.d.ts +4 -2
  108. package/dist/cjs/relayer/transport.js +10 -5
  109. package/dist/cjs/relayer/types.d.ts +40 -10
  110. package/dist/cjs/relayer/types.js +1 -1
  111. package/dist/cjs/shield/owner.js +1 -4
  112. package/dist/esm/events/index.d.ts +6 -0
  113. package/dist/esm/events/index.js +6 -0
  114. package/dist/esm/events/parsing.d.ts +25 -0
  115. package/dist/esm/events/parsing.js +120 -0
  116. package/dist/esm/events/position.d.ts +26 -0
  117. package/dist/esm/events/position.js +48 -0
  118. package/dist/esm/events/recovery.d.ts +87 -0
  119. package/dist/esm/events/recovery.js +237 -0
  120. package/dist/esm/events/scanning.d.ts +35 -0
  121. package/dist/esm/events/scanning.js +92 -0
  122. package/dist/esm/events/tree.d.ts +27 -0
  123. package/dist/esm/events/tree.js +58 -0
  124. package/dist/esm/events/types.d.ts +39 -0
  125. package/dist/esm/events/types.js +1 -0
  126. package/dist/esm/events.d.ts +1 -77
  127. package/dist/esm/events.js +3 -129
  128. package/dist/esm/identity/encoding.d.ts +9 -0
  129. package/dist/esm/identity/encoding.js +75 -0
  130. package/dist/esm/identity/index.d.ts +4 -0
  131. package/dist/esm/identity/index.js +4 -0
  132. package/dist/esm/identity/noteKey.d.ts +33 -0
  133. package/dist/esm/identity/noteKey.js +91 -0
  134. package/dist/esm/identity/spending.d.ts +18 -0
  135. package/dist/esm/identity/spending.js +35 -0
  136. package/dist/esm/identity/viewKey.d.ts +38 -0
  137. package/dist/esm/identity/viewKey.js +96 -0
  138. package/dist/esm/idl/index.d.ts +18 -0
  139. package/dist/esm/idl/index.js +18 -0
  140. package/dist/esm/idl/privacy_pool.json +9907 -9907
  141. package/dist/esm/idl/privacy_pool_legacy.d.ts +5 -0
  142. package/dist/esm/idl/privacy_pool_legacy.js +3305 -0
  143. package/dist/esm/idl/privacy_pool_legacy.json +2302 -0
  144. package/dist/esm/idl/privacy_pool_legacy2.d.ts +5 -0
  145. package/dist/esm/idl/privacy_pool_legacy2.js +3395 -0
  146. package/dist/esm/idl/privacy_pool_legacy2.json +2376 -0
  147. package/dist/esm/index.d.ts +8 -3
  148. package/dist/esm/index.js +8 -3
  149. package/dist/esm/notes/amount.d.ts +2 -0
  150. package/dist/esm/notes/amount.js +18 -0
  151. package/dist/esm/notes/index.d.ts +4 -0
  152. package/dist/esm/notes/index.js +4 -0
  153. package/dist/esm/notes/recovery.d.ts +16 -6
  154. package/dist/esm/notes/recovery.js +33 -16
  155. package/dist/esm/notes/scan.d.ts +74 -0
  156. package/dist/esm/notes/scan.js +105 -0
  157. package/dist/esm/notes/selection.d.ts +133 -0
  158. package/dist/esm/notes/selection.js +254 -0
  159. package/dist/esm/notes/spent.d.ts +60 -0
  160. package/dist/esm/notes/spent.js +96 -0
  161. package/dist/esm/perps/constants.d.ts +16 -0
  162. package/dist/esm/perps/constants.js +48 -0
  163. package/dist/esm/perps/index.d.ts +5 -0
  164. package/dist/esm/perps/index.js +5 -0
  165. package/dist/esm/perps/keys.d.ts +16 -0
  166. package/dist/esm/perps/keys.js +35 -0
  167. package/dist/esm/perps/pdas.d.ts +29 -0
  168. package/dist/esm/perps/pdas.js +47 -0
  169. package/dist/esm/perps/relayer.d.ts +9 -0
  170. package/dist/esm/perps/relayer.js +25 -0
  171. package/dist/esm/perps/types.d.ts +126 -0
  172. package/dist/esm/perps/types.js +1 -0
  173. package/dist/esm/positions/index.d.ts +4 -0
  174. package/dist/esm/positions/index.js +4 -0
  175. package/dist/esm/positions/keys.d.ts +29 -0
  176. package/dist/esm/positions/keys.js +65 -0
  177. package/dist/esm/positions/pdas.d.ts +15 -0
  178. package/dist/esm/positions/pdas.js +44 -0
  179. package/dist/esm/positions/relayer.d.ts +4 -0
  180. package/dist/esm/positions/relayer.js +10 -0
  181. package/dist/esm/positions/types.d.ts +97 -0
  182. package/dist/esm/positions/types.js +1 -0
  183. package/dist/esm/predictions/client.d.ts +41 -0
  184. package/dist/esm/predictions/client.js +141 -0
  185. package/dist/esm/predictions/index.d.ts +5 -0
  186. package/dist/esm/predictions/index.js +5 -0
  187. package/dist/esm/predictions/keys.d.ts +14 -0
  188. package/dist/esm/predictions/keys.js +33 -0
  189. package/dist/esm/predictions/pdas.d.ts +6 -0
  190. package/dist/esm/predictions/pdas.js +10 -0
  191. package/dist/esm/predictions/relayer.d.ts +3 -0
  192. package/dist/esm/predictions/relayer.js +7 -0
  193. package/dist/esm/predictions/types.d.ts +178 -0
  194. package/dist/esm/predictions/types.js +1 -0
  195. package/dist/esm/program.d.ts +2 -0
  196. package/dist/esm/program.js +4 -3
  197. package/dist/esm/prover.d.ts +27 -4
  198. package/dist/esm/prover.js +106 -15
  199. package/dist/esm/relayer/api.d.ts +41 -0
  200. package/dist/esm/relayer/api.js +66 -0
  201. package/dist/esm/relayer/client.d.ts +42 -17
  202. package/dist/esm/relayer/client.js +94 -17
  203. package/dist/esm/relayer/errors.d.ts +1 -1
  204. package/dist/esm/relayer/errors.js +1 -1
  205. package/dist/esm/relayer/index.d.ts +4 -1
  206. package/dist/esm/relayer/index.js +1 -1
  207. package/dist/esm/relayer/internal-config.d.ts +36 -0
  208. package/dist/esm/relayer/internal-config.js +6 -0
  209. package/dist/esm/relayer/internal.d.ts +6 -0
  210. package/dist/esm/relayer/internal.js +10 -0
  211. package/dist/esm/relayer/transport.d.ts +4 -2
  212. package/dist/esm/relayer/transport.js +10 -5
  213. package/dist/esm/relayer/types.d.ts +40 -10
  214. package/dist/esm/relayer/types.js +1 -1
  215. package/dist/esm/shield/owner.js +1 -4
  216. package/identity.d.ts +2 -0
  217. package/identity.js +3 -0
  218. package/idl.d.ts +2 -0
  219. package/idl.js +3 -0
  220. package/notes.d.ts +2 -0
  221. package/notes.js +3 -0
  222. package/package.json +85 -3
  223. package/perps.d.ts +2 -0
  224. package/perps.js +3 -0
  225. package/poseidon.d.ts +2 -0
  226. package/poseidon.js +3 -0
  227. package/positions.d.ts +2 -0
  228. package/positions.js +3 -0
  229. package/predictions.d.ts +2 -0
  230. package/predictions.js +3 -0
  231. package/proof.d.ts +2 -0
  232. package/proof.js +3 -0
  233. package/prover.d.ts +2 -0
  234. package/prover.js +3 -0
  235. package/relayer.d.ts +2 -0
  236. package/relayer.js +3 -0
  237. package/shield.d.ts +2 -0
  238. package/shield.js +3 -0
  239. package/transactions.d.ts +2 -0
  240. package/transactions.js +3 -0
@@ -0,0 +1,126 @@
1
+ import type { TransactNote } from "../relayer/types.js";
2
+ export type JperpMarket = "SOL" | "ETH" | "BTC";
3
+ export type JperpSide = "long" | "short";
4
+ /** Jupiter market accounts forwarded to the relayer's Perps CPI builder. */
5
+ export interface JperpMarketPayload {
6
+ custody: string;
7
+ collateralCustody: string;
8
+ /** Veilo pool mint used for notes and the ZK proof. */
9
+ inputMint: string;
10
+ /** Jupiter SPL collateral mint; WSOL when inputMint is native SOL. */
11
+ jupiterInputMint?: string;
12
+ /** Optional; the relayer resolves the known market oracle when omitted. */
13
+ dovesOracle?: string;
14
+ }
15
+ export interface JperpOpenRequest extends JperpMarketPayload {
16
+ notes: TransactNote[];
17
+ depositAmount: string;
18
+ /** 32-byte withdrawal ID, hex. */
19
+ withdrawalId: string;
20
+ claimantPublicKey: string;
21
+ userPublicKey: string;
22
+ /** Position size in Jupiter's 1e6 USD units. */
23
+ sizeUsdDelta: string;
24
+ collateralTokenDelta: string;
25
+ side: JperpSide;
26
+ priceSlippage?: string;
27
+ counter: string;
28
+ }
29
+ export interface JperpOpenResponse {
30
+ success: boolean;
31
+ message: string;
32
+ data?: {
33
+ txSignature: string;
34
+ executor: string;
35
+ position: string;
36
+ positionRequest: string;
37
+ changeAmount: string;
38
+ };
39
+ }
40
+ export interface JperpDecreaseBase extends JperpMarketPayload {
41
+ withdrawalId: string;
42
+ claimantSecretKey: string;
43
+ userPublicKey: string;
44
+ side: JperpSide;
45
+ counter: string;
46
+ }
47
+ export interface JperpCloseRequest extends JperpDecreaseBase {
48
+ collateralUsdDelta?: string;
49
+ sizeUsdDelta?: string;
50
+ entirePosition?: boolean;
51
+ priceSlippage?: string;
52
+ }
53
+ export interface JperpSetTpslRequest extends JperpDecreaseBase {
54
+ collateralUsdDelta?: string;
55
+ sizeUsdDelta?: string;
56
+ triggerPrice: string;
57
+ triggerAboveThreshold: boolean;
58
+ entirePosition?: boolean;
59
+ }
60
+ export interface JperpUpdateTpslRequest extends JperpDecreaseBase {
61
+ sizeUsdDelta?: string;
62
+ triggerPrice: string;
63
+ }
64
+ export interface JperpDecreaseResponse {
65
+ success: boolean;
66
+ message: string;
67
+ data?: {
68
+ txSignature: string;
69
+ positionRequest: string;
70
+ };
71
+ }
72
+ export interface JperpReissueRequest {
73
+ withdrawalId: string;
74
+ claimantSecretKey: string;
75
+ reissueAmount: string;
76
+ veiloPublicKey: string;
77
+ userPublicKey: string;
78
+ poolMint?: string;
79
+ }
80
+ export interface JperpReissueResponse {
81
+ success: boolean;
82
+ message: string;
83
+ data?: {
84
+ txSignature: string;
85
+ reissueAmount: string;
86
+ };
87
+ }
88
+ export interface JperpRecoverSeedRequest {
89
+ withdrawalId: string;
90
+ claimantPublicKey: string;
91
+ poolMint: string;
92
+ userPublicKey: string;
93
+ }
94
+ export interface JperpRecoverSeedResponse {
95
+ success: boolean;
96
+ message: string;
97
+ data?: {
98
+ txSignature?: string;
99
+ executorWsolAta: string;
100
+ recoverable: string;
101
+ };
102
+ }
103
+ export type JperpCancelTriggerRequest = JperpDecreaseBase;
104
+ export interface JperpCancelTriggerResponse {
105
+ success: boolean;
106
+ message: string;
107
+ data?: {
108
+ txSignature: string;
109
+ triggerRequest: string;
110
+ };
111
+ }
112
+ export interface JperpRecoverNativeRequest {
113
+ withdrawalId: string;
114
+ claimantSecretKey: string;
115
+ veiloPublicKey: string;
116
+ userPublicKey: string;
117
+ poolMint?: string;
118
+ }
119
+ export interface JperpRecoverNativeResponse {
120
+ success: boolean;
121
+ message: string;
122
+ data?: {
123
+ txSignature: string;
124
+ recoverAmount: string;
125
+ };
126
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export * from "./types.js";
2
+ export * from "./keys.js";
3
+ export * from "./pdas.js";
4
+ export * from "./relayer.js";
@@ -0,0 +1,4 @@
1
+ export * from "./types.js";
2
+ export * from "./keys.js";
3
+ export * from "./pdas.js";
4
+ export * from "./relayer.js";
@@ -0,0 +1,29 @@
1
+ import { Keypair, PublicKey } from "@solana/web3.js";
2
+ import type { NewPositionKeys, PositionNotePayload } from "./types.js";
3
+ export interface PositionKeyMaterial {
4
+ positionSecretN: bigint;
5
+ positionBlinding: bigint;
6
+ positionPubkey: bigint;
7
+ positionPdaKeyBytes: Uint8Array;
8
+ }
9
+ export interface PositionKeyBundle {
10
+ material: PositionKeyMaterial;
11
+ claimant: Keypair;
12
+ position: NewPositionKeys;
13
+ }
14
+ /** Derive the exact Poseidon key material used by private position notes. */
15
+ export declare function derivePositionKeys(spendingKey: Uint8Array, index: number): PositionKeyMaterial;
16
+ /** Deterministic claimant required to close or merge a position. */
17
+ export declare function derivePositionClaimantKeypair(spendingKey: Uint8Array, positionPdaKeyBytes: Uint8Array): Keypair;
18
+ /** Derive both local secret material and the public request payload. */
19
+ export declare function derivePositionKeyBundle(spendingKey: Uint8Array, index: number): PositionKeyBundle;
20
+ /** Serialize a returned open/merge position into the relayer's close shape. */
21
+ export declare function createPositionNotePayload(params: {
22
+ amount: bigint | string;
23
+ commitment: Uint8Array | string;
24
+ leafIndex: number;
25
+ mint: PublicKey | string;
26
+ isToken2022: boolean;
27
+ treeId?: number;
28
+ keys: PositionKeyMaterial;
29
+ }): PositionNotePayload;
@@ -0,0 +1,65 @@
1
+ import { sha256 } from "@noble/hashes/sha256";
2
+ import { Keypair, PublicKey } from "@solana/web3.js";
3
+ import { BN254_FR_MODULUS, bigIntToBytesBE, bytesToBigIntBE, poseidon1, poseidon2, } from "../poseidon.js";
4
+ import { assertBytes, bytesToHex, concatBytes, hexToBytes, utf8, } from "../identity/encoding.js";
5
+ /** Derive the exact Poseidon key material used by private position notes. */
6
+ export function derivePositionKeys(spendingKey, index) {
7
+ assertBytes(spendingKey, 32, "spending key");
8
+ if (!Number.isSafeInteger(index) || index < 0) {
9
+ throw new RangeError("position index must be a non-negative safe integer");
10
+ }
11
+ const rootSecret = bytesToBigIntBE(sha256(concatBytes(spendingKey, utf8("veilo_v1")))) % BN254_FR_MODULUS;
12
+ const positionSecretN = poseidon2(rootSecret, BigInt(index));
13
+ const positionBlinding = poseidon2(positionSecretN, 1n);
14
+ const positionPubkey = poseidon1(positionSecretN);
15
+ return {
16
+ positionSecretN,
17
+ positionBlinding,
18
+ positionPubkey,
19
+ positionPdaKeyBytes: bigIntToBytesBE(positionPubkey),
20
+ };
21
+ }
22
+ /** Deterministic claimant required to close or merge a position. */
23
+ export function derivePositionClaimantKeypair(spendingKey, positionPdaKeyBytes) {
24
+ assertBytes(spendingKey, 32, "spending key");
25
+ assertBytes(positionPdaKeyBytes, 32, "position PDA key");
26
+ return Keypair.fromSeed(sha256(concatBytes(utf8("position_claimant"), spendingKey, positionPdaKeyBytes)));
27
+ }
28
+ /** Derive both local secret material and the public request payload. */
29
+ export function derivePositionKeyBundle(spendingKey, index) {
30
+ const material = derivePositionKeys(spendingKey, index);
31
+ const claimant = derivePositionClaimantKeypair(spendingKey, material.positionPdaKeyBytes);
32
+ return {
33
+ material,
34
+ claimant,
35
+ position: {
36
+ pubkey: material.positionPubkey.toString(),
37
+ blinding: bytesToHex(bigIntToBytesBE(material.positionBlinding)),
38
+ pdaKey: bytesToHex(material.positionPdaKeyBytes),
39
+ claimantPublicKey: claimant.publicKey.toBase58(),
40
+ },
41
+ };
42
+ }
43
+ /** Serialize a returned open/merge position into the relayer's close shape. */
44
+ export function createPositionNotePayload(params) {
45
+ if (!Number.isSafeInteger(params.leafIndex) || params.leafIndex < 0) {
46
+ throw new RangeError("leafIndex must be a non-negative safe integer");
47
+ }
48
+ const commitment = typeof params.commitment === "string"
49
+ ? hexToBytes(params.commitment, 32, "position commitment")
50
+ : params.commitment;
51
+ assertBytes(commitment, 32, "position commitment");
52
+ const mint = params.mint instanceof PublicKey ? params.mint : new PublicKey(params.mint);
53
+ return {
54
+ amount: params.amount.toString(),
55
+ commitment: bytesToHex(commitment),
56
+ privateKey: bytesToHex(bigIntToBytesBE(params.keys.positionSecretN)),
57
+ publicKey: params.keys.positionPubkey.toString(),
58
+ blinding: bytesToHex(bigIntToBytesBE(params.keys.positionBlinding)),
59
+ leafIndex: params.leafIndex,
60
+ positionPdaKey: bytesToHex(params.keys.positionPdaKeyBytes),
61
+ mint: mint.toBase58(),
62
+ isToken2022: params.isToken2022,
63
+ treeId: params.treeId ?? 0,
64
+ };
65
+ }
@@ -0,0 +1,15 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ export declare function derivePositionConfigPda(programId: PublicKey): PublicKey;
3
+ export declare function derivePositionTreePda(programId: PublicKey, treeId?: number): PublicKey;
4
+ export declare function derivePositionVaultRecordPda(programId: PublicKey, mint: PublicKey): PublicKey;
5
+ export declare function derivePositionVaultPda(programId: PublicKey, mint: PublicKey): PublicKey;
6
+ export declare function derivePositionPda(programId: PublicKey, positionPdaKey: Uint8Array): PublicKey;
7
+ export declare function derivePositionNullifierMarkerPda(programId: PublicKey, mint: PublicKey, nullifier: Uint8Array): PublicKey;
8
+ export declare function derivePositionExecutorPda(params: {
9
+ programId: PublicKey;
10
+ sourceMint: PublicKey;
11
+ destMint: PublicKey;
12
+ inputNullifier0: Uint8Array;
13
+ relayer: PublicKey;
14
+ }): PublicKey;
15
+ export declare function derivePositionSwapLegsBufferPda(programId: PublicKey, nullifier0: Uint8Array): PublicKey;
@@ -0,0 +1,44 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ import { assertBytes, utf8 } from "../identity/encoding.js";
3
+ function treeIdLe(treeId) {
4
+ if (!Number.isInteger(treeId) || treeId < 0 || treeId > 0xffff) {
5
+ throw new RangeError("position tree ID must be an unsigned 16-bit integer");
6
+ }
7
+ const bytes = new Uint8Array(2);
8
+ new DataView(bytes.buffer).setUint16(0, treeId, true);
9
+ return bytes;
10
+ }
11
+ export function derivePositionConfigPda(programId) {
12
+ return PublicKey.findProgramAddressSync([utf8("position_config_v1")], programId)[0];
13
+ }
14
+ export function derivePositionTreePda(programId, treeId = 0) {
15
+ return PublicKey.findProgramAddressSync([utf8("position_tree_v1"), treeIdLe(treeId)], programId)[0];
16
+ }
17
+ export function derivePositionVaultRecordPda(programId, mint) {
18
+ return PublicKey.findProgramAddressSync([utf8("position_vault_v1"), mint.toBytes()], programId)[0];
19
+ }
20
+ export function derivePositionVaultPda(programId, mint) {
21
+ return PublicKey.findProgramAddressSync([utf8("position_vault_token_v1"), mint.toBytes()], programId)[0];
22
+ }
23
+ export function derivePositionPda(programId, positionPdaKey) {
24
+ assertBytes(positionPdaKey, 32, "position PDA key");
25
+ return PublicKey.findProgramAddressSync([utf8("position_pda_v1"), positionPdaKey], programId)[0];
26
+ }
27
+ export function derivePositionNullifierMarkerPda(programId, mint, nullifier) {
28
+ assertBytes(nullifier, 32, "position nullifier");
29
+ return PublicKey.findProgramAddressSync([utf8("position_nullifier_v1"), mint.toBytes(), nullifier], programId)[0];
30
+ }
31
+ export function derivePositionExecutorPda(params) {
32
+ assertBytes(params.inputNullifier0, 32, "input nullifier");
33
+ return PublicKey.findProgramAddressSync([
34
+ utf8("position_executor"),
35
+ params.sourceMint.toBytes(),
36
+ params.destMint.toBytes(),
37
+ params.inputNullifier0,
38
+ params.relayer.toBytes(),
39
+ ], params.programId)[0];
40
+ }
41
+ export function derivePositionSwapLegsBufferPda(programId, nullifier0) {
42
+ assertBytes(nullifier0, 32, "input nullifier");
43
+ return PublicKey.findProgramAddressSync([utf8("swap_legs_v1"), nullifier0], programId)[0];
44
+ }
@@ -0,0 +1,4 @@
1
+ import type { ClosePositionRequest, ClosePositionResponse, MergePositionsRequest, MergePositionsResponse, OpenPositionRequest, OpenPositionResponse } from "./types.js";
2
+ export declare function submitOpenPosition(data: OpenPositionRequest): Promise<OpenPositionResponse>;
3
+ export declare function submitClosePosition(data: ClosePositionRequest): Promise<ClosePositionResponse>;
4
+ export declare function submitMergePositions(data: MergePositionsRequest): Promise<MergePositionsResponse>;
@@ -0,0 +1,10 @@
1
+ import { getInternalRelayerClient } from "../relayer/internal.js";
2
+ export function submitOpenPosition(data) {
3
+ return getInternalRelayerClient().submitOpenPosition(data);
4
+ }
5
+ export function submitClosePosition(data) {
6
+ return getInternalRelayerClient().submitClosePosition(data);
7
+ }
8
+ export function submitMergePositions(data) {
9
+ return getInternalRelayerClient().submitMergePositions(data);
10
+ }
@@ -0,0 +1,97 @@
1
+ import type { TransactNote } from "../relayer/types.js";
2
+ /** Client-derived public material for a new private position note. */
3
+ export interface NewPositionKeys {
4
+ /** Position owner field element, decimal. */
5
+ pubkey: string;
6
+ /** Position blinding, 32-byte hex. */
7
+ blinding: string;
8
+ /** Position PDA key, 32-byte hex. */
9
+ pdaKey: string;
10
+ /** Deterministic claimant public key, base58. */
11
+ claimantPublicKey: string;
12
+ }
13
+ /** Spendable private-position note passed back to the relayer. */
14
+ export interface PositionNotePayload {
15
+ amount: string;
16
+ commitment: string;
17
+ privateKey: string;
18
+ publicKey: string;
19
+ blinding: string;
20
+ leafIndex: number;
21
+ positionPdaKey: string;
22
+ mint: string;
23
+ isToken2022: boolean;
24
+ treeId: number;
25
+ }
26
+ export interface OpenPositionRequest {
27
+ notes: TransactNote[];
28
+ sourceMintAddress: string;
29
+ destMintAddress: string;
30
+ swapAmountRaw: string;
31
+ slippageBps: number;
32
+ userPublicKey: string;
33
+ veiloPublicKey: string;
34
+ position: NewPositionKeys;
35
+ positionTreeId?: number;
36
+ isToken2022?: boolean;
37
+ dexes?: string;
38
+ pumpDirect?: boolean;
39
+ }
40
+ export interface OpenPositionResponse {
41
+ success: boolean;
42
+ message: string;
43
+ data?: {
44
+ txSignature: string;
45
+ positionAmount: string;
46
+ changeAmount: string;
47
+ positionPda: string;
48
+ mint: string;
49
+ positionCommitment: string;
50
+ positionLeafIndex: number;
51
+ positionTreeId: number;
52
+ isToken2022: boolean;
53
+ };
54
+ }
55
+ export interface ClosePositionRequest {
56
+ positionNote: PositionNotePayload;
57
+ destMintAddress: string;
58
+ slippageBps: number;
59
+ userPublicKey: string;
60
+ veiloPublicKey: string;
61
+ /** Base58-encoded deterministic claimant secret key. */
62
+ claimantSecretKey: string;
63
+ dexes?: string;
64
+ staged?: boolean;
65
+ }
66
+ export interface ClosePositionResponse {
67
+ success: boolean;
68
+ message: string;
69
+ data?: {
70
+ txSignature: string;
71
+ outputAmount: string;
72
+ feeRaw: string;
73
+ destMint: string;
74
+ };
75
+ }
76
+ export interface MergePositionsRequest {
77
+ positionNotes: [PositionNotePayload, PositionNotePayload];
78
+ mint: string;
79
+ userPublicKey: string;
80
+ veiloPublicKey: string;
81
+ newPosition: NewPositionKeys;
82
+ /** Base58 claimant secret shared by both input PositionPDAs. */
83
+ claimantSecretKey: string;
84
+ }
85
+ export interface MergePositionsResponse {
86
+ success: boolean;
87
+ message: string;
88
+ data?: {
89
+ txSignature: string;
90
+ mergedAmount: string;
91
+ newPositionPda: string;
92
+ mergedCommitment: string;
93
+ mergedLeafIndex: number;
94
+ positionTreeId: number;
95
+ mint: string;
96
+ };
97
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ import { VersionedTransaction } from "@solana/web3.js";
2
+ import type { PlacePredictionOrderRequest, PlacePredictionOrderResponse, PredictionEvent, PredictionHistoryEvent, PredictionOrderStatusResponse, PredictionPosition, PredictionPriceInterval, PredictionPricePoint, PredictionTransactionResponse } from "./types.js";
3
+ export declare const JUPITER_PREDICTION_API_URL = "https://api.jup.ag/prediction/v1";
4
+ export declare const POLYMARKET_CLOB_API_URL = "https://clob.polymarket.com";
5
+ export interface JupiterPredictionClientConfig {
6
+ apiKey: string;
7
+ baseUrl?: string;
8
+ polymarketBaseUrl?: string;
9
+ fetch?: typeof fetch;
10
+ }
11
+ export declare class JupiterPredictionApiError extends Error {
12
+ readonly status: number;
13
+ readonly code?: string;
14
+ readonly responseBody: unknown;
15
+ constructor(status: number, responseBody: unknown);
16
+ }
17
+ /** Typed client for the unsigned Jupiter Prediction transaction API. */
18
+ export declare class JupiterPredictionClient {
19
+ private readonly apiKey;
20
+ private readonly baseUrl;
21
+ private readonly polymarketBaseUrl;
22
+ private readonly fetcher;
23
+ constructor(config: JupiterPredictionClientConfig);
24
+ listEvents(params?: {
25
+ category?: string;
26
+ status?: string;
27
+ }): Promise<PredictionEvent[]>;
28
+ getEvent(eventId: string): Promise<PredictionEvent>;
29
+ listPositions(ownerPubkey: string): Promise<PredictionPosition[]>;
30
+ listHistory(ownerPubkey: string): Promise<PredictionHistoryEvent[]>;
31
+ getPosition(positionPubkey: string): Promise<PredictionPosition>;
32
+ placeOrder(request: PlacePredictionOrderRequest): Promise<PlacePredictionOrderResponse>;
33
+ getOrderStatus(orderPubkey: string): Promise<PredictionOrderStatusResponse>;
34
+ closePosition(positionPubkey: string, ownerPubkey: string): Promise<PredictionTransactionResponse>;
35
+ closeAllPositions(ownerPubkey: string, minSellPriceSlippageBps?: number): Promise<PredictionTransactionResponse>;
36
+ claimPosition(positionPubkey: string, ownerPubkey: string): Promise<PredictionTransactionResponse>;
37
+ getPriceHistory(clobTokenId: string, interval: PredictionPriceInterval): Promise<PredictionPricePoint[]>;
38
+ private request;
39
+ }
40
+ /** Decode an unsigned transaction returned by Jupiter for wallet signing. */
41
+ export declare function deserializePredictionTransaction(response: PredictionTransactionResponse): VersionedTransaction;
@@ -0,0 +1,141 @@
1
+ import { VersionedTransaction } from "@solana/web3.js";
2
+ export const JUPITER_PREDICTION_API_URL = "https://api.jup.ag/prediction/v1";
3
+ export const POLYMARKET_CLOB_API_URL = "https://clob.polymarket.com";
4
+ export class JupiterPredictionApiError extends Error {
5
+ constructor(status, responseBody) {
6
+ const body = typeof responseBody === "object" && responseBody !== null
7
+ ? responseBody
8
+ : undefined;
9
+ const message = typeof responseBody === "string" && responseBody
10
+ ? responseBody
11
+ : typeof body?.message === "string"
12
+ ? body.message
13
+ : typeof body?.error === "string"
14
+ ? body.error
15
+ : `Jupiter Prediction API request failed: ${status}`;
16
+ super(message);
17
+ this.name = "JupiterPredictionApiError";
18
+ this.status = status;
19
+ this.code = typeof body?.error === "string" ? body.error : undefined;
20
+ this.responseBody = responseBody;
21
+ }
22
+ }
23
+ /** Typed client for the unsigned Jupiter Prediction transaction API. */
24
+ export class JupiterPredictionClient {
25
+ constructor(config) {
26
+ this.apiKey = config.apiKey;
27
+ this.baseUrl = normalizeBaseUrl(config.baseUrl ?? JUPITER_PREDICTION_API_URL, "baseUrl");
28
+ this.polymarketBaseUrl = normalizeBaseUrl(config.polymarketBaseUrl ?? POLYMARKET_CLOB_API_URL, "polymarketBaseUrl");
29
+ this.fetcher = config.fetch ?? fetch;
30
+ }
31
+ async listEvents(params = {}) {
32
+ const query = new URLSearchParams({ status: params.status ?? "live" });
33
+ if (params.category)
34
+ query.set("category", params.category);
35
+ return (await this.request(`/events?${query}`)).data;
36
+ }
37
+ async getEvent(eventId) {
38
+ return this.request(`/events/${encodeURIComponent(eventId)}`);
39
+ }
40
+ async listPositions(ownerPubkey) {
41
+ return (await this.request(`/positions?ownerPubkey=${encodeURIComponent(ownerPubkey)}`)).data;
42
+ }
43
+ async listHistory(ownerPubkey) {
44
+ return (await this.request(`/history?ownerPubkey=${encodeURIComponent(ownerPubkey)}`)).data;
45
+ }
46
+ async getPosition(positionPubkey) {
47
+ return this.request(`/positions/${encodeURIComponent(positionPubkey)}`);
48
+ }
49
+ async placeOrder(request) {
50
+ return this.request("/orders", { method: "POST", body: request });
51
+ }
52
+ async getOrderStatus(orderPubkey) {
53
+ return this.request(`/orders/status/${encodeURIComponent(orderPubkey)}`);
54
+ }
55
+ async closePosition(positionPubkey, ownerPubkey) {
56
+ return this.request(`/positions/${encodeURIComponent(positionPubkey)}`, {
57
+ method: "DELETE",
58
+ body: { ownerPubkey },
59
+ });
60
+ }
61
+ async closeAllPositions(ownerPubkey, minSellPriceSlippageBps = 300) {
62
+ return this.request("/positions", {
63
+ method: "DELETE",
64
+ body: { ownerPubkey, minSellPriceSlippageBps },
65
+ });
66
+ }
67
+ async claimPosition(positionPubkey, ownerPubkey) {
68
+ return this.request(`/positions/${encodeURIComponent(positionPubkey)}/claim`, { method: "POST", body: { ownerPubkey } });
69
+ }
70
+ async getPriceHistory(clobTokenId, interval) {
71
+ const fidelity = {
72
+ "1d": 5,
73
+ "1w": 30,
74
+ "1m": 180,
75
+ max: 180,
76
+ };
77
+ const query = new URLSearchParams({
78
+ market: clobTokenId,
79
+ interval,
80
+ fidelity: String(fidelity[interval]),
81
+ });
82
+ const response = await this.fetcher(`${this.polymarketBaseUrl}/prices-history?${query}`);
83
+ const body = await readResponseBody(response);
84
+ if (!response.ok) {
85
+ throw new JupiterPredictionApiError(response.status, body);
86
+ }
87
+ return body.history ?? [];
88
+ }
89
+ async request(path, options = {}) {
90
+ const response = await this.fetcher(`${this.baseUrl}${path}`, {
91
+ method: options.method ?? "GET",
92
+ headers: {
93
+ "x-api-key": this.apiKey,
94
+ ...(options.body === undefined
95
+ ? {}
96
+ : { "Content-Type": "application/json" }),
97
+ },
98
+ body: options.body === undefined ? undefined : JSON.stringify(options.body),
99
+ });
100
+ const body = await readResponseBody(response);
101
+ if (!response.ok) {
102
+ throw new JupiterPredictionApiError(response.status, body);
103
+ }
104
+ return body;
105
+ }
106
+ }
107
+ /** Decode an unsigned transaction returned by Jupiter for wallet signing. */
108
+ export function deserializePredictionTransaction(response) {
109
+ if (!response.transaction) {
110
+ throw new TypeError("Prediction transaction must not be empty");
111
+ }
112
+ return VersionedTransaction.deserialize(decodeBase64(response.transaction));
113
+ }
114
+ function normalizeBaseUrl(value, label) {
115
+ const normalized = value.trim().replace(/\/+$/, "");
116
+ if (!normalized)
117
+ throw new TypeError(`${label} must not be empty`);
118
+ return normalized;
119
+ }
120
+ async function readResponseBody(response) {
121
+ const body = await response.text();
122
+ if (!body)
123
+ return {};
124
+ try {
125
+ return JSON.parse(body);
126
+ }
127
+ catch {
128
+ return body;
129
+ }
130
+ }
131
+ function decodeBase64(encoded) {
132
+ if (typeof Buffer !== "undefined") {
133
+ return new Uint8Array(Buffer.from(encoded, "base64"));
134
+ }
135
+ const binary = atob(encoded);
136
+ const bytes = new Uint8Array(binary.length);
137
+ for (let index = 0; index < binary.length; index++) {
138
+ bytes[index] = binary.charCodeAt(index);
139
+ }
140
+ return bytes;
141
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./types.js";
2
+ export * from "./keys.js";
3
+ export * from "./pdas.js";
4
+ export * from "./client.js";
5
+ export * from "./relayer.js";
@@ -0,0 +1,5 @@
1
+ export * from "./types.js";
2
+ export * from "./keys.js";
3
+ export * from "./pdas.js";
4
+ export * from "./client.js";
5
+ export * from "./relayer.js";
@@ -0,0 +1,14 @@
1
+ import { Keypair } from "@solana/web3.js";
2
+ export interface PredictionKeyBundle {
3
+ withdrawalId: Uint8Array;
4
+ withdrawalIdHex: string;
5
+ ephemeral: Keypair;
6
+ claimantPublicKey: string;
7
+ claimantSecretKey: string;
8
+ }
9
+ export declare function derivePredictionEphemeralKeypair(spendingKey: Uint8Array, nonce: number): Keypair;
10
+ export declare function derivePredictionWithdrawalId(spendingKey: Uint8Array, nonce: number): Uint8Array;
11
+ export declare function predictionWithdrawalIdToHex(withdrawalId: Uint8Array): string;
12
+ export declare function predictionWithdrawalIdFromHex(value: string): Uint8Array;
13
+ /** Derive every client-held key field needed across a prediction lifecycle. */
14
+ export declare function derivePredictionKeyBundle(spendingKey: Uint8Array, nonce: number): PredictionKeyBundle;
@@ -0,0 +1,33 @@
1
+ import { sha256 } from "@noble/hashes/sha256";
2
+ import { Keypair } from "@solana/web3.js";
3
+ import { assertBytes, bytesToHex, concatBytes, encodeBase58, hexToBytes, uint32Le, uint64Le, utf8, } from "../identity/encoding.js";
4
+ export function derivePredictionEphemeralKeypair(spendingKey, nonce) {
5
+ assertBytes(spendingKey, 32, "spending key");
6
+ if (!Number.isSafeInteger(nonce) || nonce < 0) {
7
+ throw new RangeError("prediction nonce must be a non-negative safe integer");
8
+ }
9
+ return Keypair.fromSeed(sha256(concatBytes(utf8("prediction_ephemeral"), spendingKey, uint64Le(BigInt(nonce), "prediction nonce"))));
10
+ }
11
+ export function derivePredictionWithdrawalId(spendingKey, nonce) {
12
+ assertBytes(spendingKey, 32, "spending key");
13
+ return sha256(concatBytes(utf8("prediction_withdrawal_v1"), spendingKey, uint32Le(nonce, "prediction nonce")));
14
+ }
15
+ export function predictionWithdrawalIdToHex(withdrawalId) {
16
+ assertBytes(withdrawalId, 32, "prediction withdrawal ID");
17
+ return bytesToHex(withdrawalId);
18
+ }
19
+ export function predictionWithdrawalIdFromHex(value) {
20
+ return hexToBytes(value, 32, "prediction withdrawal ID");
21
+ }
22
+ /** Derive every client-held key field needed across a prediction lifecycle. */
23
+ export function derivePredictionKeyBundle(spendingKey, nonce) {
24
+ const withdrawalId = derivePredictionWithdrawalId(spendingKey, nonce);
25
+ const ephemeral = derivePredictionEphemeralKeypair(spendingKey, nonce);
26
+ return {
27
+ withdrawalId,
28
+ withdrawalIdHex: predictionWithdrawalIdToHex(withdrawalId),
29
+ ephemeral,
30
+ claimantPublicKey: ephemeral.publicKey.toBase58(),
31
+ claimantSecretKey: encodeBase58(ephemeral.secretKey),
32
+ };
33
+ }
@@ -0,0 +1,6 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ export declare function derivePredictionSlotPda(params: {
3
+ programId: PublicKey;
4
+ mint: PublicKey;
5
+ withdrawalId: Uint8Array;
6
+ }): PublicKey;