@acta-markets/ts-sdk 0.0.1-beta

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 (263) hide show
  1. package/README.md +308 -0
  2. package/dist/actaClient.d.ts +46 -0
  3. package/dist/actaClient.js +99 -0
  4. package/dist/chain/client.d.ts +65 -0
  5. package/dist/chain/client.js +82 -0
  6. package/dist/chain/fetch.d.ts +204 -0
  7. package/dist/chain/fetch.js +392 -0
  8. package/dist/chain/fetch.test.d.ts +1 -0
  9. package/dist/chain/fetch.test.js +158 -0
  10. package/dist/chain/flows/index.d.ts +1 -0
  11. package/dist/chain/flows/index.js +1 -0
  12. package/dist/chain/flows/openPosition.d.ts +48 -0
  13. package/dist/chain/flows/openPosition.js +78 -0
  14. package/dist/chain/flows/openPosition.test.d.ts +1 -0
  15. package/dist/chain/flows/openPosition.test.js +43 -0
  16. package/dist/chain/helpers.d.ts +16 -0
  17. package/dist/chain/helpers.js +60 -0
  18. package/dist/chain/index.d.ts +9 -0
  19. package/dist/chain/index.js +9 -0
  20. package/dist/chain/instructions.admin.d.ts +44 -0
  21. package/dist/chain/instructions.admin.js +113 -0
  22. package/dist/chain/instructions.d.ts +5 -0
  23. package/dist/chain/instructions.js +5 -0
  24. package/dist/chain/instructions.maker.d.ts +34 -0
  25. package/dist/chain/instructions.maker.js +86 -0
  26. package/dist/chain/instructions.market.d.ts +39 -0
  27. package/dist/chain/instructions.market.js +107 -0
  28. package/dist/chain/instructions.oracle.d.ts +38 -0
  29. package/dist/chain/instructions.oracle.js +63 -0
  30. package/dist/chain/instructions.position.d.ts +82 -0
  31. package/dist/chain/instructions.position.js +240 -0
  32. package/dist/chain/instructions.resolve.test.d.ts +1 -0
  33. package/dist/chain/instructions.resolve.test.js +32 -0
  34. package/dist/chain/instructions.shared.d.ts +23 -0
  35. package/dist/chain/instructions.shared.js +55 -0
  36. package/dist/chain/orders.d.ts +40 -0
  37. package/dist/chain/orders.js +117 -0
  38. package/dist/chain/orders.test.d.ts +1 -0
  39. package/dist/chain/orders.test.js +67 -0
  40. package/dist/chain/signers.d.ts +9 -0
  41. package/dist/chain/signers.js +19 -0
  42. package/dist/chain/signers.test.d.ts +1 -0
  43. package/dist/chain/signers.test.js +13 -0
  44. package/dist/chain/token.d.ts +59 -0
  45. package/dist/chain/token.js +136 -0
  46. package/dist/chain/token.test.d.ts +1 -0
  47. package/dist/chain/token.test.js +69 -0
  48. package/dist/chain/tx.d.ts +72 -0
  49. package/dist/chain/tx.js +97 -0
  50. package/dist/cjs/actaClient.js +103 -0
  51. package/dist/cjs/chain/client.js +119 -0
  52. package/dist/cjs/chain/fetch.js +431 -0
  53. package/dist/cjs/chain/fetch.test.js +160 -0
  54. package/dist/cjs/chain/flows/index.js +17 -0
  55. package/dist/cjs/chain/flows/openPosition.js +81 -0
  56. package/dist/cjs/chain/flows/openPosition.test.js +45 -0
  57. package/dist/cjs/chain/helpers.js +67 -0
  58. package/dist/cjs/chain/index.js +48 -0
  59. package/dist/cjs/chain/instructions.admin.js +119 -0
  60. package/dist/cjs/chain/instructions.js +21 -0
  61. package/dist/cjs/chain/instructions.maker.js +92 -0
  62. package/dist/cjs/chain/instructions.market.js +112 -0
  63. package/dist/cjs/chain/instructions.oracle.js +70 -0
  64. package/dist/cjs/chain/instructions.position.js +247 -0
  65. package/dist/cjs/chain/instructions.resolve.test.js +34 -0
  66. package/dist/cjs/chain/instructions.shared.js +64 -0
  67. package/dist/cjs/chain/orders.js +126 -0
  68. package/dist/cjs/chain/orders.test.js +69 -0
  69. package/dist/cjs/chain/signers.js +22 -0
  70. package/dist/cjs/chain/signers.test.js +15 -0
  71. package/dist/cjs/chain/token.js +147 -0
  72. package/dist/cjs/chain/token.test.js +71 -0
  73. package/dist/cjs/chain/tx.js +103 -0
  74. package/dist/cjs/constants.js +6 -0
  75. package/dist/cjs/constants.test.js +31 -0
  76. package/dist/cjs/events.js +75 -0
  77. package/dist/cjs/events.test.js +384 -0
  78. package/dist/cjs/generated/accounts/config.js +79 -0
  79. package/dist/cjs/generated/accounts/index.js +28 -0
  80. package/dist/cjs/generated/accounts/maker.js +71 -0
  81. package/dist/cjs/generated/accounts/market.js +93 -0
  82. package/dist/cjs/generated/accounts/oracle.js +85 -0
  83. package/dist/cjs/generated/accounts/position.js +89 -0
  84. package/dist/cjs/generated/errors/actaContract.js +154 -0
  85. package/dist/cjs/generated/errors/index.js +24 -0
  86. package/dist/cjs/generated/index.js +28 -0
  87. package/dist/cjs/generated/instructions/changeOracleSource.js +81 -0
  88. package/dist/cjs/generated/instructions/closeMarket.js +83 -0
  89. package/dist/cjs/generated/instructions/closeOracle.js +79 -0
  90. package/dist/cjs/generated/instructions/createMarket.js +116 -0
  91. package/dist/cjs/generated/instructions/createOracle.js +99 -0
  92. package/dist/cjs/generated/instructions/depositFundsToPosition.js +101 -0
  93. package/dist/cjs/generated/instructions/depositPremium.js +96 -0
  94. package/dist/cjs/generated/instructions/finalizeMarket.js +91 -0
  95. package/dist/cjs/generated/instructions/index.js +43 -0
  96. package/dist/cjs/generated/instructions/initializeConfig.js +108 -0
  97. package/dist/cjs/generated/instructions/liquidatePosition.js +107 -0
  98. package/dist/cjs/generated/instructions/openPosition.js +154 -0
  99. package/dist/cjs/generated/instructions/registerMaker.js +90 -0
  100. package/dist/cjs/generated/instructions/setOracleConfig.js +80 -0
  101. package/dist/cjs/generated/instructions/settlePosition.js +104 -0
  102. package/dist/cjs/generated/instructions/topupFeeFund.js +96 -0
  103. package/dist/cjs/generated/instructions/updateConfig.js +86 -0
  104. package/dist/cjs/generated/instructions/updateMakerQuoteSigning.js +79 -0
  105. package/dist/cjs/generated/instructions/updateMarketOracles.js +96 -0
  106. package/dist/cjs/generated/instructions/updateOraclePrice.js +89 -0
  107. package/dist/cjs/generated/instructions/withdrawFromFeeFund.js +96 -0
  108. package/dist/cjs/generated/instructions/withdrawPremium.js +96 -0
  109. package/dist/cjs/generated/programs/actaContract.js +108 -0
  110. package/dist/cjs/generated/programs/index.js +24 -0
  111. package/dist/cjs/generated/shared/index.js +94 -0
  112. package/dist/cjs/generated/types/actaEvent.js +342 -0
  113. package/dist/cjs/generated/types/eventKind.js +45 -0
  114. package/dist/cjs/generated/types/index.js +27 -0
  115. package/dist/cjs/generated/types/positionStatus.js +31 -0
  116. package/dist/cjs/generated/types/positionType.js +28 -0
  117. package/dist/cjs/idl/acta_contract.json +2329 -0
  118. package/dist/cjs/idl/hash.js +4 -0
  119. package/dist/cjs/index.js +84 -0
  120. package/dist/cjs/nonce.js +93 -0
  121. package/dist/cjs/package.json +3 -0
  122. package/dist/cjs/types/index.js +18 -0
  123. package/dist/cjs/types/orderId.js +40 -0
  124. package/dist/cjs/types/orders.js +10 -0
  125. package/dist/cjs/ws/apy.js +106 -0
  126. package/dist/cjs/ws/apy.test.js +29 -0
  127. package/dist/cjs/ws/auth.js +104 -0
  128. package/dist/cjs/ws/client.handshake.integration.test.js +69 -0
  129. package/dist/cjs/ws/client.js +861 -0
  130. package/dist/cjs/ws/client.test.js +230 -0
  131. package/dist/cjs/ws/discovery.js +48 -0
  132. package/dist/cjs/ws/flows.js +101 -0
  133. package/dist/cjs/ws/flows.test.js +85 -0
  134. package/dist/cjs/ws/index.js +23 -0
  135. package/dist/cjs/ws/sponsoredTx.js +95 -0
  136. package/dist/cjs/ws/types.js +14 -0
  137. package/dist/cjs/ws/wirePolicy.js +34 -0
  138. package/dist/constants.d.ts +2 -0
  139. package/dist/constants.js +3 -0
  140. package/dist/constants.test.d.ts +1 -0
  141. package/dist/constants.test.js +29 -0
  142. package/dist/events.d.ts +15 -0
  143. package/dist/events.js +64 -0
  144. package/dist/events.test.d.ts +1 -0
  145. package/dist/events.test.js +382 -0
  146. package/dist/generated/accounts/config.d.ts +47 -0
  147. package/dist/generated/accounts/config.js +68 -0
  148. package/dist/generated/accounts/index.d.ts +12 -0
  149. package/dist/generated/accounts/index.js +12 -0
  150. package/dist/generated/accounts/maker.d.ts +39 -0
  151. package/dist/generated/accounts/maker.js +60 -0
  152. package/dist/generated/accounts/market.d.ts +61 -0
  153. package/dist/generated/accounts/market.js +82 -0
  154. package/dist/generated/accounts/oracle.d.ts +53 -0
  155. package/dist/generated/accounts/oracle.js +74 -0
  156. package/dist/generated/accounts/position.d.ts +57 -0
  157. package/dist/generated/accounts/position.js +78 -0
  158. package/dist/generated/errors/actaContract.d.ts +103 -0
  159. package/dist/generated/errors/actaContract.js +149 -0
  160. package/dist/generated/errors/index.d.ts +8 -0
  161. package/dist/generated/errors/index.js +8 -0
  162. package/dist/generated/index.d.ts +12 -0
  163. package/dist/generated/index.js +12 -0
  164. package/dist/generated/instructions/changeOracleSource.d.ts +50 -0
  165. package/dist/generated/instructions/changeOracleSource.js +72 -0
  166. package/dist/generated/instructions/closeMarket.d.ts +58 -0
  167. package/dist/generated/instructions/closeMarket.js +74 -0
  168. package/dist/generated/instructions/closeOracle.d.ts +48 -0
  169. package/dist/generated/instructions/closeOracle.js +70 -0
  170. package/dist/generated/instructions/createMarket.d.ts +90 -0
  171. package/dist/generated/instructions/createMarket.js +107 -0
  172. package/dist/generated/instructions/createOracle.d.ts +71 -0
  173. package/dist/generated/instructions/createOracle.js +90 -0
  174. package/dist/generated/instructions/depositFundsToPosition.d.ts +73 -0
  175. package/dist/generated/instructions/depositFundsToPosition.js +92 -0
  176. package/dist/generated/instructions/depositPremium.d.ts +62 -0
  177. package/dist/generated/instructions/depositPremium.js +87 -0
  178. package/dist/generated/instructions/finalizeMarket.d.ts +63 -0
  179. package/dist/generated/instructions/finalizeMarket.js +82 -0
  180. package/dist/generated/instructions/index.d.ts +27 -0
  181. package/dist/generated/instructions/index.js +27 -0
  182. package/dist/generated/instructions/initializeConfig.d.ts +75 -0
  183. package/dist/generated/instructions/initializeConfig.js +99 -0
  184. package/dist/generated/instructions/liquidatePosition.d.ts +78 -0
  185. package/dist/generated/instructions/liquidatePosition.js +98 -0
  186. package/dist/generated/instructions/openPosition.d.ts +130 -0
  187. package/dist/generated/instructions/openPosition.js +145 -0
  188. package/dist/generated/instructions/registerMaker.d.ts +57 -0
  189. package/dist/generated/instructions/registerMaker.js +81 -0
  190. package/dist/generated/instructions/setOracleConfig.d.ts +53 -0
  191. package/dist/generated/instructions/setOracleConfig.js +71 -0
  192. package/dist/generated/instructions/settlePosition.d.ts +78 -0
  193. package/dist/generated/instructions/settlePosition.js +95 -0
  194. package/dist/generated/instructions/topupFeeFund.d.ts +67 -0
  195. package/dist/generated/instructions/topupFeeFund.js +87 -0
  196. package/dist/generated/instructions/updateConfig.d.ts +58 -0
  197. package/dist/generated/instructions/updateConfig.js +77 -0
  198. package/dist/generated/instructions/updateMakerQuoteSigning.d.ts +47 -0
  199. package/dist/generated/instructions/updateMakerQuoteSigning.js +70 -0
  200. package/dist/generated/instructions/updateMarketOracles.d.ts +65 -0
  201. package/dist/generated/instructions/updateMarketOracles.js +87 -0
  202. package/dist/generated/instructions/updateOraclePrice.d.ts +55 -0
  203. package/dist/generated/instructions/updateOraclePrice.js +80 -0
  204. package/dist/generated/instructions/withdrawFromFeeFund.d.ts +62 -0
  205. package/dist/generated/instructions/withdrawFromFeeFund.js +87 -0
  206. package/dist/generated/instructions/withdrawPremium.d.ts +62 -0
  207. package/dist/generated/instructions/withdrawPremium.js +87 -0
  208. package/dist/generated/programs/actaContract.d.ts +83 -0
  209. package/dist/generated/programs/actaContract.js +104 -0
  210. package/dist/generated/programs/index.d.ts +8 -0
  211. package/dist/generated/programs/index.js +8 -0
  212. package/dist/generated/shared/index.d.ts +49 -0
  213. package/dist/generated/shared/index.js +86 -0
  214. package/dist/generated/types/actaEvent.d.ts +249 -0
  215. package/dist/generated/types/actaEvent.js +335 -0
  216. package/dist/generated/types/eventKind.d.ts +33 -0
  217. package/dist/generated/types/eventKind.js +39 -0
  218. package/dist/generated/types/index.d.ts +11 -0
  219. package/dist/generated/types/index.js +11 -0
  220. package/dist/generated/types/positionStatus.d.ts +19 -0
  221. package/dist/generated/types/positionStatus.js +25 -0
  222. package/dist/generated/types/positionType.d.ts +16 -0
  223. package/dist/generated/types/positionType.js +22 -0
  224. package/dist/idl/acta_contract.json +2329 -0
  225. package/dist/idl/hash.d.ts +1 -0
  226. package/dist/idl/hash.js +1 -0
  227. package/dist/index.d.ts +109 -0
  228. package/dist/index.js +34 -0
  229. package/dist/nonce.d.ts +29 -0
  230. package/dist/nonce.js +89 -0
  231. package/dist/types/index.d.ts +2 -0
  232. package/dist/types/index.js +2 -0
  233. package/dist/types/orderId.d.ts +13 -0
  234. package/dist/types/orderId.js +35 -0
  235. package/dist/types/orders.d.ts +9 -0
  236. package/dist/types/orders.js +9 -0
  237. package/dist/ws/apy.d.ts +79 -0
  238. package/dist/ws/apy.js +98 -0
  239. package/dist/ws/apy.test.d.ts +1 -0
  240. package/dist/ws/apy.test.js +27 -0
  241. package/dist/ws/auth.d.ts +67 -0
  242. package/dist/ws/auth.js +98 -0
  243. package/dist/ws/client.d.ts +263 -0
  244. package/dist/ws/client.handshake.integration.test.d.ts +1 -0
  245. package/dist/ws/client.handshake.integration.test.js +64 -0
  246. package/dist/ws/client.js +857 -0
  247. package/dist/ws/client.test.d.ts +1 -0
  248. package/dist/ws/client.test.js +228 -0
  249. package/dist/ws/discovery.d.ts +13 -0
  250. package/dist/ws/discovery.js +44 -0
  251. package/dist/ws/flows.d.ts +44 -0
  252. package/dist/ws/flows.js +96 -0
  253. package/dist/ws/flows.test.d.ts +1 -0
  254. package/dist/ws/flows.test.js +83 -0
  255. package/dist/ws/index.d.ts +7 -0
  256. package/dist/ws/index.js +7 -0
  257. package/dist/ws/sponsoredTx.d.ts +39 -0
  258. package/dist/ws/sponsoredTx.js +92 -0
  259. package/dist/ws/types.d.ts +900 -0
  260. package/dist/ws/types.js +13 -0
  261. package/dist/ws/wirePolicy.d.ts +12 -0
  262. package/dist/ws/wirePolicy.js +30 -0
  263. package/package.json +87 -0
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ACTA_IDL_SHA256 = void 0;
4
+ exports.ACTA_IDL_SHA256 = "1466fbb647b4c33af315eefbb61e5e572ce14f22f16d050ac2894f8e017aaf66";
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.ACTA_IDL_SHA256 = exports.ACTA_PROGRAM_ID = exports.ACTA_IDL = exports.ActaChainClient = exports.CustomAuthProvider = exports.WalletAuthProvider = exports.KeypairAuthProvider = exports.ActaWsClient = exports.types = exports.chain = exports.ws = void 0;
43
+ exports.getActaProgramId = getActaProgramId;
44
+ exports.setActaProgramId = setActaProgramId;
45
+ exports.clearActaProgramId = clearActaProgramId;
46
+ const acta_contract_json_1 = __importDefault(require("./idl/acta_contract.json"));
47
+ const hash_1 = require("./idl/hash");
48
+ Object.defineProperty(exports, "ACTA_IDL_SHA256", { enumerable: true, get: function () { return hash_1.ACTA_IDL_SHA256; } });
49
+ const programs_1 = require("./generated/programs");
50
+ __exportStar(require("./constants"), exports);
51
+ __exportStar(require("./generated/accounts"), exports);
52
+ __exportStar(require("./generated/errors"), exports);
53
+ __exportStar(require("./generated/instructions"), exports);
54
+ __exportStar(require("./generated/types"), exports);
55
+ __exportStar(require("./actaClient"), exports);
56
+ __exportStar(require("./events"), exports);
57
+ __exportStar(require("./nonce"), exports);
58
+ // New SDK surface (namespaced).
59
+ exports.ws = __importStar(require("./ws"));
60
+ exports.chain = __importStar(require("./chain"));
61
+ exports.types = __importStar(require("./types"));
62
+ var client_1 = require("./ws/client");
63
+ Object.defineProperty(exports, "ActaWsClient", { enumerable: true, get: function () { return client_1.ActaWsClient; } });
64
+ var auth_1 = require("./ws/auth");
65
+ Object.defineProperty(exports, "KeypairAuthProvider", { enumerable: true, get: function () { return auth_1.KeypairAuthProvider; } });
66
+ Object.defineProperty(exports, "WalletAuthProvider", { enumerable: true, get: function () { return auth_1.WalletAuthProvider; } });
67
+ Object.defineProperty(exports, "CustomAuthProvider", { enumerable: true, get: function () { return auth_1.CustomAuthProvider; } });
68
+ var client_2 = require("./chain/client");
69
+ Object.defineProperty(exports, "ActaChainClient", { enumerable: true, get: function () { return client_2.ActaChainClient; } });
70
+ __exportStar(require("./chain/tx"), exports);
71
+ exports.ACTA_IDL = acta_contract_json_1.default;
72
+ // --- Program ID override (useful for tests/devnet deployments) ---
73
+ let PROGRAM_ID_OVERRIDE = null;
74
+ function getActaProgramId() {
75
+ return (PROGRAM_ID_OVERRIDE ?? programs_1.ACTA_CONTRACT_PROGRAM_ADDRESS);
76
+ }
77
+ function setActaProgramId(programId) {
78
+ PROGRAM_ID_OVERRIDE = programId;
79
+ }
80
+ function clearActaProgramId() {
81
+ PROGRAM_ID_OVERRIDE = null;
82
+ }
83
+ // Default program id exports.
84
+ exports.ACTA_PROGRAM_ID = programs_1.ACTA_CONTRACT_PROGRAM_ADDRESS;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * Nonce helpers for maker quotes.
4
+ *
5
+ * IMPORTANT:
6
+ * - If you don't pass a seed, the SDK will try to use `crypto.getRandomValues`.
7
+ * - If no crypto source is available, you MUST provide a 32-byte seed.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.NonceGenerator = void 0;
11
+ const MASK_64 = (1n << 64n) - 1n;
12
+ const MAX_SAFE_U64 = (1n << 53n) - 1n;
13
+ const SEED_SIZE = 32;
14
+ function u64(x) {
15
+ return x & MASK_64;
16
+ }
17
+ function rotl(x, k) {
18
+ return u64((x << k) | (x >> (64n - k)));
19
+ }
20
+ function readU64LE(bytes, offset) {
21
+ let out = 0n;
22
+ for (let i = 7; i >= 0; i--) {
23
+ out = (out << 8n) | BigInt(bytes[offset + i]);
24
+ }
25
+ return out;
26
+ }
27
+ function ensureNonZeroState(state) {
28
+ if ((state[0] | state[1] | state[2] | state[3]) === 0n) {
29
+ throw new Error("nonce seed must not be all zeros");
30
+ }
31
+ }
32
+ function makeSeed() {
33
+ if (globalThis.crypto?.getRandomValues) {
34
+ const seed = new Uint8Array(SEED_SIZE);
35
+ globalThis.crypto.getRandomValues(seed);
36
+ return seed;
37
+ }
38
+ throw new Error("no crypto.getRandomValues available; provide a 32-byte seed explicitly");
39
+ }
40
+ /**
41
+ * Xoshiro256++ nonce generator (fast, deterministic).
42
+ * Seed can be passed explicitly (recommended for reproducibility),
43
+ * or generated internally if crypto.getRandomValues is available.
44
+ */
45
+ class NonceGenerator {
46
+ s0;
47
+ s1;
48
+ s2;
49
+ s3;
50
+ seed;
51
+ constructor(seed) {
52
+ const resolvedSeed = seed ? new Uint8Array(seed) : makeSeed();
53
+ if (resolvedSeed.length !== SEED_SIZE) {
54
+ throw new Error(`nonce seed must be 32 bytes, got ${resolvedSeed.length}`);
55
+ }
56
+ const state = [
57
+ readU64LE(resolvedSeed, 0),
58
+ readU64LE(resolvedSeed, 8),
59
+ readU64LE(resolvedSeed, 16),
60
+ readU64LE(resolvedSeed, 24),
61
+ ];
62
+ ensureNonZeroState(state);
63
+ this.s0 = u64(state[0]);
64
+ this.s1 = u64(state[1]);
65
+ this.s2 = u64(state[2]);
66
+ this.s3 = u64(state[3]);
67
+ this.seed = resolvedSeed;
68
+ }
69
+ /** Return a copy of the seed used to initialize this generator. */
70
+ getSeed() {
71
+ return new Uint8Array(this.seed);
72
+ }
73
+ /** Return next raw u64 (as bigint). */
74
+ nextU64() {
75
+ const result = u64(rotl(u64(this.s0 + this.s3), 23n) + this.s0);
76
+ const t = u64(this.s1 << 17n);
77
+ this.s2 ^= this.s0;
78
+ this.s3 ^= this.s1;
79
+ this.s1 ^= this.s2;
80
+ this.s0 ^= this.s3;
81
+ this.s2 ^= t;
82
+ this.s3 = rotl(this.s3, 45n);
83
+ return result;
84
+ }
85
+ /**
86
+ * Return a nonce safe for JSON (`number`).
87
+ * Uses lower 53 bits to avoid precision loss.
88
+ */
89
+ nextNonce() {
90
+ return Number(this.nextU64() & MAX_SAFE_U64);
91
+ }
92
+ }
93
+ exports.NonceGenerator = NonceGenerator;
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./orders"), exports);
18
+ __exportStar(require("./orderId"), exports);
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * Canonical OrderId representation across the SDK.
4
+ *
5
+ * Contract expects `orderId` as **32 bytes**: `sha256(order_preimage_182)`.
6
+ *
7
+ * - In TypeScript we represent it as `Uint8Array` of length 32.
8
+ * - For JSON/Wire formats we typically use **hex** (64 chars) when needed.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.assertOrderId32 = assertOrderId32;
12
+ exports.orderIdToHex = orderIdToHex;
13
+ exports.orderIdFromHex = orderIdFromHex;
14
+ function assertOrderId32(orderId) {
15
+ if (!(orderId instanceof Uint8Array)) {
16
+ throw new Error("orderId must be a Uint8Array");
17
+ }
18
+ if (orderId.length !== 32) {
19
+ throw new Error(`orderId must be 32 bytes, got ${orderId.length}`);
20
+ }
21
+ }
22
+ function orderIdToHex(orderId) {
23
+ assertOrderId32(orderId);
24
+ return Buffer.from(orderId).toString("hex");
25
+ }
26
+ function orderIdFromHex(hex) {
27
+ if (typeof hex !== "string") {
28
+ throw new Error("orderId hex must be a string");
29
+ }
30
+ const cleaned = hex.startsWith("0x") ? hex.slice(2) : hex;
31
+ if (cleaned.length !== 64) {
32
+ throw new Error(`orderId hex must be 64 hex chars (32 bytes), got ${cleaned.length}`);
33
+ }
34
+ if (!/^[0-9a-fA-F]+$/.test(cleaned)) {
35
+ throw new Error("orderId hex contains non-hex characters");
36
+ }
37
+ const bytes = Uint8Array.from(Buffer.from(cleaned, "hex"));
38
+ assertOrderId32(bytes);
39
+ return bytes;
40
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * SDK-level order-related *types*.
4
+ *
5
+ * These types are shared across on-chain flows and any off-chain tooling that needs
6
+ * to construct or reason about order preimages / orderIds.
7
+ *
8
+ * Implementation lives in `src/chain/orders.ts`.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * APY / annualized premium yield helpers for WS-only frontends.
4
+ *
5
+ * Goal: given a quote premium and an option term, compute:
6
+ * - "how much premium will I receive?" (notional)
7
+ * - "what is that as APR/APY?" (annualized)
8
+ *
9
+ * This is a display metric (premium / collateral), NOT an expected return model.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SECONDS_PER_YEAR = exports.PRICE_SCALE = void 0;
13
+ exports.annualizeYield = annualizeYield;
14
+ exports.termYieldFromNotionals = termYieldFromNotionals;
15
+ exports.computeApyFromAmounts = computeApyFromAmounts;
16
+ exports.scaledPriceToFloat = scaledPriceToFloat;
17
+ exports.computeApyFromScaledPrices = computeApyFromScaledPrices;
18
+ exports.PRICE_SCALE = 1_000_000_000;
19
+ exports.SECONDS_PER_YEAR = 365 * 24 * 60 * 60;
20
+ /** Annualize a term yield over `secondsToExpiry`. */
21
+ function annualizeYield(args) {
22
+ const y = args.termYield;
23
+ const dt = args.secondsToExpiry;
24
+ if (!Number.isFinite(y) || y < 0)
25
+ throw new Error("invalid termYield");
26
+ if (!Number.isFinite(dt) || dt <= 0)
27
+ return { apr: 0, apy: 0 };
28
+ const yearOverDt = exports.SECONDS_PER_YEAR / dt;
29
+ const apr = y * yearOverDt;
30
+ const apy = Math.pow(1 + y, yearOverDt) - 1;
31
+ return { apr, apy };
32
+ }
33
+ /** term_yield = premium_notional / collateral_notional */
34
+ function termYieldFromNotionals(args) {
35
+ const p = args.premiumNotional;
36
+ const c = args.collateralNotional;
37
+ if (!Number.isFinite(p) || p < 0)
38
+ throw new Error("invalid premiumNotional");
39
+ if (!Number.isFinite(c) || c <= 0)
40
+ throw new Error("invalid collateralNotional");
41
+ return p / c;
42
+ }
43
+ /**
44
+ * Compute premium/collateral notionals and APR/APY from *human unit* amounts.
45
+ *
46
+ * Example (your case):
47
+ * - covered_call
48
+ * - underlyingAmount = 10 SOL
49
+ * - spotPrice = 150 USD/SOL => collateralNotional = 1500 USD
50
+ * - premiumPerUnderlying = 1.5 USD/SOL => premiumNotional = 15 USD
51
+ * - 7 days => ~52% APR (simple)
52
+ */
53
+ function computeApyFromAmounts(args) {
54
+ const qty = args.underlyingAmount;
55
+ if (!Number.isFinite(qty) || qty <= 0)
56
+ throw new Error("invalid underlyingAmount");
57
+ const premPU = args.premiumPerUnderlying;
58
+ if (!Number.isFinite(premPU) || premPU < 0)
59
+ throw new Error("invalid premiumPerUnderlying");
60
+ const premiumNotional = qty * premPU;
61
+ let collateralPerUnderlying;
62
+ if (args.positionType === "cash_secured_put") {
63
+ collateralPerUnderlying = args.strikePrice;
64
+ }
65
+ else {
66
+ collateralPerUnderlying = args.spotPrice ?? NaN;
67
+ }
68
+ if (!Number.isFinite(collateralPerUnderlying) || collateralPerUnderlying <= 0) {
69
+ throw new Error(args.positionType === "covered_call"
70
+ ? "spotPrice is required for covered_call yield"
71
+ : "invalid strikePrice");
72
+ }
73
+ const collateralNotional = qty * collateralPerUnderlying;
74
+ const termYield = termYieldFromNotionals({ premiumNotional, collateralNotional });
75
+ const { apr, apy } = annualizeYield({ termYield, secondsToExpiry: args.secondsToExpiry });
76
+ return { premiumNotional, collateralNotional, termYield, apr, apy };
77
+ }
78
+ function toNum(v) {
79
+ // Note: bigint->number can lose precision for huge values; acceptable for UI display.
80
+ return typeof v === "bigint" ? Number(v) : v;
81
+ }
82
+ /** Convert a 1e9-scaled u64 price into a float price. */
83
+ function scaledPriceToFloat(price1e9) {
84
+ const n = toNum(price1e9);
85
+ if (!Number.isFinite(n))
86
+ throw new Error("invalid price1e9");
87
+ return n / exports.PRICE_SCALE;
88
+ }
89
+ /**
90
+ * Convenience wrapper for WS-native numeric fields (1e9-scale).
91
+ *
92
+ * - `grossPremiumPerUnit1e9` is WS quote `price`
93
+ * - `strike1e9` is RFQ/quote strike
94
+ * - `spotPrice1e9` must be provided for covered_call (from your own spot feed)
95
+ * - `secondsToExpiry` should be (market.expiry_ts - now)
96
+ */
97
+ function computeApyFromScaledPrices(args) {
98
+ return computeApyFromAmounts({
99
+ positionType: args.positionType,
100
+ underlyingAmount: args.underlyingAmount,
101
+ premiumPerUnderlying: scaledPriceToFloat(args.grossPremiumPerUnit1e9),
102
+ strikePrice: scaledPriceToFloat(args.strike1e9),
103
+ spotPrice: args.spotPrice1e9 == null ? undefined : scaledPriceToFloat(args.spotPrice1e9),
104
+ secondsToExpiry: args.secondsToExpiry,
105
+ });
106
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const apy_1 = require("./apy");
4
+ describe("ws apy helpers", () => {
5
+ it("matches the intuitive 10 SOL @ $150, $15 premium, 7 days => ~52% APR", () => {
6
+ const res = (0, apy_1.computeApyFromAmounts)({
7
+ positionType: "covered_call",
8
+ underlyingAmount: 10,
9
+ spotPrice: 150,
10
+ strikePrice: 150, // not used for calls
11
+ premiumPerUnderlying: 1.5,
12
+ secondsToExpiry: 7 * 24 * 60 * 60,
13
+ });
14
+ expect(res.premiumNotional).toBeCloseTo(15, 10);
15
+ expect(res.collateralNotional).toBeCloseTo(1500, 10);
16
+ expect(res.termYield).toBeCloseTo(0.01, 10);
17
+ expect(res.apr).toBeCloseTo(0.01 * (365 / 7), 3);
18
+ });
19
+ it("scaled wrapper works (1e9 scale)", () => {
20
+ const res = (0, apy_1.computeApyFromScaledPrices)({
21
+ positionType: "cash_secured_put",
22
+ underlyingAmount: 10,
23
+ grossPremiumPerUnit1e9: 1_500_000_000, // 1.5
24
+ strike1e9: 150_000_000_000, // 150
25
+ secondsToExpiry: 7 * 24 * 60 * 60,
26
+ });
27
+ expect(res.premiumNotional).toBeCloseTo(15, 10);
28
+ });
29
+ });
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * WebSocket auth providers.
4
+ *
5
+ * RFQ WS auth handshake:
6
+ * - Server sends `AuthRequest { challenge: <human-readable text> }`
7
+ * - Client signs UTF-8 bytes of that text and responds:
8
+ * `AuthChallenge { challenge, signature: base58(ed25519(utf8(challenge))), pubkey }`
9
+ *
10
+ * Source of truth (server):
11
+ * - rust-backend/rfq-server/src/server/ws.rs
12
+ * - rust-backend/rfq-server/src/session/handler.rs
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CustomAuthProvider = exports.WalletAuthProvider = exports.KeypairAuthProvider = void 0;
16
+ const addresses_1 = require("@solana/addresses");
17
+ const keys_1 = require("@solana/keys");
18
+ const codecs_strings_1 = require("@solana/codecs-strings");
19
+ const bytesToBase58 = (() => {
20
+ const dec = (0, codecs_strings_1.getBase58Decoder)();
21
+ return (bytes) => dec.decode(bytes);
22
+ })();
23
+ const utf8ToBytes = (value) => new TextEncoder().encode(value);
24
+ /**
25
+ * Auth provider backed by a `CryptoKeyPair`.
26
+ *
27
+ */
28
+ class KeypairAuthProvider {
29
+ address;
30
+ privateKey;
31
+ constructor(args) {
32
+ this.address = args.address;
33
+ this.privateKey = args.privateKey;
34
+ }
35
+ /** Create from a Solana CLI-style 64-byte secret key array (private + public). */
36
+ static async fromSecretKeyBytes(secretKey64) {
37
+ const keyPair = await (0, keys_1.createKeyPairFromBytes)(secretKey64);
38
+ const address = await (0, addresses_1.getAddressFromPublicKey)(keyPair.publicKey);
39
+ return new KeypairAuthProvider({ address, privateKey: keyPair.privateKey });
40
+ }
41
+ /** Create from a 32-byte private key. */
42
+ static async fromPrivateKeyBytes(privateKey32) {
43
+ const keyPair = await (0, keys_1.createKeyPairFromPrivateKeyBytes)(privateKey32);
44
+ const address = await (0, addresses_1.getAddressFromPublicKey)(keyPair.publicKey);
45
+ return new KeypairAuthProvider({ address, privateKey: keyPair.privateKey });
46
+ }
47
+ /** Create from Solana CLI keypair JSON (array of numbers). */
48
+ static async fromJson(json) {
49
+ const arr = typeof json === "string" ? JSON.parse(json) : json;
50
+ return KeypairAuthProvider.fromSecretKeyBytes(Uint8Array.from(arr));
51
+ }
52
+ async getPublicKey() {
53
+ return this.address;
54
+ }
55
+ async signChallenge(challenge) {
56
+ const challengeBytes = utf8ToBytes(challenge);
57
+ const signatureBytes = await (0, keys_1.signBytes)(this.privateKey, challengeBytes);
58
+ return bytesToBase58(signatureBytes);
59
+ }
60
+ }
61
+ exports.KeypairAuthProvider = KeypairAuthProvider;
62
+ /**
63
+ * Wallet-like provider (browser wallets, custom signers, etc.)
64
+ *
65
+ * We intentionally do NOT depend on @solana/web3.js types. Consumers can adapt their wallet
66
+ * implementation to this minimal interface.
67
+ */
68
+ class WalletAuthProvider {
69
+ wallet;
70
+ constructor(wallet) {
71
+ this.wallet = wallet;
72
+ }
73
+ async getPublicKey() {
74
+ const pk = this.wallet.publicKeyBase58 ?? this.wallet.publicKey?.toBase58?.();
75
+ if (!pk)
76
+ throw new Error("Wallet not connected (missing public key)");
77
+ return pk;
78
+ }
79
+ async signChallenge(challenge) {
80
+ const challengeBytes = utf8ToBytes(challenge);
81
+ // Some wallet APIs expect a mutable `Uint8Array`; codecs return `ReadonlyUint8Array`.
82
+ const sig = await this.wallet.signMessage(new Uint8Array(challengeBytes));
83
+ return bytesToBase58(sig);
84
+ }
85
+ }
86
+ exports.WalletAuthProvider = WalletAuthProvider;
87
+ /**
88
+ * Custom auth provider for fully custom integrations (hardware wallets, remote signers, etc.).
89
+ */
90
+ class CustomAuthProvider {
91
+ getPublicKeyFn;
92
+ signChallengeFn;
93
+ constructor(getPublicKey, signChallenge) {
94
+ this.getPublicKeyFn = getPublicKey;
95
+ this.signChallengeFn = signChallenge;
96
+ }
97
+ async getPublicKey() {
98
+ return this.getPublicKeyFn();
99
+ }
100
+ async signChallenge(challenge) {
101
+ return this.signChallengeFn(challenge);
102
+ }
103
+ }
104
+ exports.CustomAuthProvider = CustomAuthProvider;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ws_1 = __importDefault(require("ws"));
7
+ const client_1 = require("./client");
8
+ const wsE2eUrl = process.env.ACTA_WS_E2E_URL;
9
+ const describeIfWsUrl = wsE2eUrl ? describe : describe.skip;
10
+ describeIfWsUrl("ws handshake integration (real backend)", () => {
11
+ jest.setTimeout(20_000);
12
+ it("performs Hello -> Welcome without VersionMismatch", async () => {
13
+ await new Promise((resolve, reject) => {
14
+ const client = new client_1.ActaWsClient({
15
+ url: wsE2eUrl,
16
+ role: "taker",
17
+ autoReconnect: false,
18
+ makeSocket: (url) => new ws_1.default(url),
19
+ });
20
+ let settled = false;
21
+ let welcomeReceived = false;
22
+ const timeout = setTimeout(() => {
23
+ finish(new Error("Timed out waiting for Welcome"));
24
+ }, 15_000);
25
+ const finish = (err) => {
26
+ if (settled)
27
+ return;
28
+ settled = true;
29
+ clearTimeout(timeout);
30
+ try {
31
+ client.disconnect();
32
+ }
33
+ catch {
34
+ // ignore disconnect cleanup errors in tests
35
+ }
36
+ if (err) {
37
+ reject(err);
38
+ }
39
+ else {
40
+ resolve();
41
+ }
42
+ };
43
+ client.on("welcome", (msg) => {
44
+ try {
45
+ expect(msg.protocol_version).toBe("1.0.0");
46
+ welcomeReceived = true;
47
+ finish();
48
+ }
49
+ catch (err) {
50
+ finish(err);
51
+ }
52
+ });
53
+ client.on("versionMismatch", (msg) => {
54
+ finish(new Error(`Unexpected VersionMismatch: requested=${msg.requested_version} server=${msg.server_version} min=${msg.min_supported_version}`));
55
+ });
56
+ client.on("error", (err) => {
57
+ if (!welcomeReceived) {
58
+ finish(err);
59
+ }
60
+ });
61
+ client.on("disconnected", (code, reason) => {
62
+ if (!welcomeReceived) {
63
+ finish(new Error(`Disconnected before Welcome (${code} ${reason})`));
64
+ }
65
+ });
66
+ client.connectAnonymous();
67
+ });
68
+ });
69
+ });