@unlink-xyz/core 0.1.2 → 0.1.3-canary.0877bfe

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 (350) hide show
  1. package/dist/account/{zkAccount.d.ts → account.d.ts} +7 -5
  2. package/dist/account/account.d.ts.map +1 -0
  3. package/dist/account/{zkAccount.js → account.js} +57 -43
  4. package/dist/browser/index.js +108202 -0
  5. package/dist/browser/index.js.map +1 -0
  6. package/dist/circuits.json +74 -0
  7. package/dist/clients/broadcaster.d.ts +7 -2
  8. package/dist/clients/broadcaster.d.ts.map +1 -1
  9. package/dist/clients/broadcaster.js +9 -1
  10. package/dist/clients/http.d.ts +6 -0
  11. package/dist/clients/http.d.ts.map +1 -1
  12. package/dist/clients/http.js +24 -9
  13. package/dist/clients/indexer.d.ts +11 -0
  14. package/dist/clients/indexer.d.ts.map +1 -1
  15. package/dist/clients/indexer.js +40 -11
  16. package/dist/config.d.ts +28 -9
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/config.js +33 -26
  19. package/dist/constants.d.ts +6 -0
  20. package/dist/constants.d.ts.map +1 -0
  21. package/dist/constants.js +5 -0
  22. package/dist/core.d.ts.map +1 -1
  23. package/dist/core.js +5 -2
  24. package/dist/crypto-adapters/auto-init.d.ts +2 -0
  25. package/dist/crypto-adapters/auto-init.d.ts.map +1 -0
  26. package/dist/crypto-adapters/auto-init.js +7 -0
  27. package/dist/crypto-adapters/index.d.ts +22 -0
  28. package/dist/crypto-adapters/index.d.ts.map +1 -0
  29. package/dist/crypto-adapters/index.js +47 -0
  30. package/dist/crypto-adapters/polyfills.d.ts +5 -0
  31. package/dist/crypto-adapters/polyfills.d.ts.map +1 -0
  32. package/dist/crypto-adapters/polyfills.js +8 -0
  33. package/dist/errors.d.ts +9 -0
  34. package/dist/errors.d.ts.map +1 -1
  35. package/dist/errors.js +18 -0
  36. package/dist/history/index.d.ts +3 -0
  37. package/dist/history/index.d.ts.map +1 -0
  38. package/dist/history/index.js +2 -0
  39. package/dist/history/service.d.ts +46 -0
  40. package/dist/history/service.d.ts.map +1 -0
  41. package/dist/history/service.js +354 -0
  42. package/dist/history/types.d.ts +21 -0
  43. package/dist/history/types.d.ts.map +1 -0
  44. package/dist/index.d.ts +12 -5
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +11 -4
  47. package/dist/keys/address.d.ts +13 -0
  48. package/dist/keys/address.d.ts.map +1 -0
  49. package/dist/keys/address.js +55 -0
  50. package/dist/keys/derive.d.ts +37 -0
  51. package/dist/keys/derive.d.ts.map +1 -0
  52. package/dist/keys/derive.js +112 -0
  53. package/dist/keys/hex.d.ts +17 -0
  54. package/dist/keys/hex.d.ts.map +1 -0
  55. package/dist/keys/hex.js +66 -0
  56. package/dist/keys/index.d.ts +5 -0
  57. package/dist/keys/index.d.ts.map +1 -0
  58. package/dist/keys/index.js +4 -0
  59. package/dist/keys/mnemonic.d.ts +8 -0
  60. package/dist/keys/mnemonic.d.ts.map +1 -0
  61. package/dist/keys/mnemonic.js +23 -0
  62. package/dist/keys.d.ts +4 -1
  63. package/dist/keys.d.ts.map +1 -1
  64. package/dist/keys.js +4 -0
  65. package/dist/prover/config.d.ts +1 -15
  66. package/dist/prover/config.d.ts.map +1 -1
  67. package/dist/prover/config.js +1 -11
  68. package/dist/prover/prover.d.ts +15 -4
  69. package/dist/prover/prover.d.ts.map +1 -1
  70. package/dist/prover/prover.js +115 -98
  71. package/dist/prover/registry.d.ts +3 -30
  72. package/dist/prover/registry.d.ts.map +1 -1
  73. package/dist/prover/registry.js +12 -51
  74. package/dist/state/merkle/hydrator.d.ts.map +1 -1
  75. package/dist/state/merkle/hydrator.js +3 -2
  76. package/dist/state/merkle/index.d.ts +1 -1
  77. package/dist/state/merkle/index.d.ts.map +1 -1
  78. package/dist/state/merkle/index.js +1 -1
  79. package/dist/state/merkle/merkle-tree.d.ts +8 -0
  80. package/dist/state/merkle/merkle-tree.d.ts.map +1 -1
  81. package/dist/state/merkle/merkle-tree.js +16 -7
  82. package/dist/state/store/ciphertext-store.d.ts +4 -0
  83. package/dist/state/store/ciphertext-store.d.ts.map +1 -1
  84. package/dist/state/store/ciphertext-store.js +12 -0
  85. package/dist/state/store/history-store.d.ts +24 -0
  86. package/dist/state/store/history-store.d.ts.map +1 -0
  87. package/dist/state/store/history-store.js +53 -0
  88. package/dist/state/store/index.d.ts +3 -2
  89. package/dist/state/store/index.d.ts.map +1 -1
  90. package/dist/state/store/index.js +1 -0
  91. package/dist/state/store/job-store.d.ts +7 -7
  92. package/dist/state/store/job-store.d.ts.map +1 -1
  93. package/dist/state/store/job-store.js +65 -39
  94. package/dist/state/store/jobs.d.ts +65 -18
  95. package/dist/state/store/jobs.d.ts.map +1 -1
  96. package/dist/state/store/leaf-store.d.ts.map +1 -1
  97. package/dist/state/store/leaf-store.js +0 -3
  98. package/dist/state/store/note-store.d.ts +7 -7
  99. package/dist/state/store/note-store.d.ts.map +1 -1
  100. package/dist/state/store/note-store.js +38 -34
  101. package/dist/state/store/nullifier-store.d.ts +9 -0
  102. package/dist/state/store/nullifier-store.d.ts.map +1 -1
  103. package/dist/state/store/nullifier-store.js +32 -2
  104. package/dist/state/store/records.d.ts +31 -2
  105. package/dist/state/store/records.d.ts.map +1 -1
  106. package/dist/state/store/root-store.d.ts.map +1 -1
  107. package/dist/state/store/root-store.js +0 -4
  108. package/dist/state/store/store.d.ts +61 -27
  109. package/dist/state/store/store.d.ts.map +1 -1
  110. package/dist/state/store/store.js +92 -1
  111. package/dist/storage/indexeddb.js +1 -1
  112. package/dist/storage/memory.d.ts.map +1 -1
  113. package/dist/storage/memory.js +5 -1
  114. package/dist/transactions/deposit.d.ts +12 -15
  115. package/dist/transactions/deposit.d.ts.map +1 -1
  116. package/dist/transactions/deposit.js +203 -152
  117. package/dist/transactions/index.d.ts +7 -4
  118. package/dist/transactions/index.d.ts.map +1 -1
  119. package/dist/transactions/index.js +7 -2
  120. package/dist/transactions/note-selection.d.ts +17 -0
  121. package/dist/transactions/note-selection.d.ts.map +1 -0
  122. package/dist/transactions/note-selection.js +201 -0
  123. package/dist/transactions/note-sync.d.ts +5 -33
  124. package/dist/transactions/note-sync.d.ts.map +1 -1
  125. package/dist/transactions/note-sync.js +320 -155
  126. package/dist/transactions/reconcile.d.ts +10 -12
  127. package/dist/transactions/reconcile.d.ts.map +1 -1
  128. package/dist/transactions/reconcile.js +53 -7
  129. package/dist/transactions/transact.d.ts +13 -24
  130. package/dist/transactions/transact.d.ts.map +1 -1
  131. package/dist/transactions/transact.js +393 -507
  132. package/dist/transactions/transaction-planner.d.ts +34 -0
  133. package/dist/transactions/transaction-planner.d.ts.map +1 -0
  134. package/dist/transactions/transaction-planner.js +116 -0
  135. package/dist/transactions/transfer-planner.d.ts +36 -0
  136. package/dist/transactions/transfer-planner.d.ts.map +1 -0
  137. package/dist/transactions/transfer-planner.js +85 -0
  138. package/dist/transactions/types/deposit.d.ts +67 -0
  139. package/dist/transactions/types/deposit.d.ts.map +1 -0
  140. package/dist/transactions/types/domain.d.ts +67 -0
  141. package/dist/transactions/types/domain.d.ts.map +1 -0
  142. package/dist/transactions/types/domain.js +4 -0
  143. package/dist/transactions/types/index.d.ts +18 -0
  144. package/dist/transactions/types/index.d.ts.map +1 -0
  145. package/dist/transactions/types/index.js +17 -0
  146. package/dist/transactions/types/options.d.ts +45 -0
  147. package/dist/transactions/types/options.d.ts.map +1 -0
  148. package/dist/transactions/types/options.js +1 -0
  149. package/dist/transactions/types/planning.d.ts +80 -0
  150. package/dist/transactions/types/planning.d.ts.map +1 -0
  151. package/dist/transactions/types/planning.js +1 -0
  152. package/dist/transactions/types/state-stores.d.ts +103 -0
  153. package/dist/transactions/types/state-stores.d.ts.map +1 -0
  154. package/dist/transactions/types/state-stores.js +1 -0
  155. package/dist/transactions/types/transact.d.ts +76 -0
  156. package/dist/transactions/types/transact.d.ts.map +1 -0
  157. package/dist/transactions/types/transact.js +1 -0
  158. package/dist/transactions/withdrawal-planner.d.ts +58 -0
  159. package/dist/transactions/withdrawal-planner.d.ts.map +1 -0
  160. package/dist/transactions/withdrawal-planner.js +128 -0
  161. package/dist/tsconfig.tsbuildinfo +1 -1
  162. package/dist/tsup.browser.config.d.ts +7 -0
  163. package/dist/tsup.browser.config.d.ts.map +1 -0
  164. package/dist/tsup.browser.config.js +34 -0
  165. package/dist/utils/amounts.d.ts +39 -0
  166. package/dist/utils/amounts.d.ts.map +1 -0
  167. package/dist/utils/amounts.js +89 -0
  168. package/dist/utils/async.d.ts +9 -0
  169. package/dist/utils/async.d.ts.map +1 -1
  170. package/dist/utils/async.js +24 -0
  171. package/dist/utils/bigint.js +7 -7
  172. package/dist/utils/crypto.d.ts +11 -5
  173. package/dist/utils/crypto.d.ts.map +1 -1
  174. package/dist/utils/crypto.js +12 -6
  175. package/dist/utils/format.d.ts +25 -0
  176. package/dist/utils/format.d.ts.map +1 -0
  177. package/dist/utils/format.js +33 -0
  178. package/dist/utils/json-codec.js +1 -1
  179. package/dist/utils/notes.d.ts +15 -0
  180. package/dist/utils/notes.d.ts.map +1 -0
  181. package/dist/utils/notes.js +14 -0
  182. package/dist/utils/polling.d.ts +5 -0
  183. package/dist/utils/polling.d.ts.map +1 -1
  184. package/dist/utils/polling.js +5 -0
  185. package/dist/utils/random.d.ts +13 -0
  186. package/dist/utils/random.d.ts.map +1 -0
  187. package/dist/utils/random.js +27 -0
  188. package/dist/utils/secure-memory.d.ts +25 -0
  189. package/dist/utils/secure-memory.d.ts.map +1 -0
  190. package/dist/utils/secure-memory.js +28 -0
  191. package/dist/utils/signature.d.ts +6 -0
  192. package/dist/utils/signature.d.ts.map +1 -1
  193. package/dist/utils/signature.js +8 -6
  194. package/dist/utils/validators.d.ts +21 -10
  195. package/dist/utils/validators.d.ts.map +1 -1
  196. package/dist/utils/validators.js +37 -11
  197. package/dist/vitest.config.d.ts +3 -0
  198. package/dist/vitest.config.d.ts.map +1 -0
  199. package/dist/vitest.config.js +13 -0
  200. package/package.json +28 -11
  201. package/.eslintrc.json +0 -4
  202. package/account/zkAccount.test.ts +0 -316
  203. package/account/zkAccount.ts +0 -222
  204. package/clients/broadcaster.ts +0 -67
  205. package/clients/http.ts +0 -94
  206. package/clients/indexer.ts +0 -150
  207. package/config.ts +0 -39
  208. package/core.ts +0 -17
  209. package/dist/account/railgun-imports-prototype.d.ts +0 -12
  210. package/dist/account/railgun-imports-prototype.d.ts.map +0 -1
  211. package/dist/account/railgun-imports-prototype.js +0 -30
  212. package/dist/account/zkAccount.d.ts.map +0 -1
  213. package/dist/key-derivation/babyjubjub.d.ts +0 -9
  214. package/dist/key-derivation/babyjubjub.d.ts.map +0 -1
  215. package/dist/key-derivation/babyjubjub.js +0 -9
  216. package/dist/key-derivation/bech32.d.ts +0 -22
  217. package/dist/key-derivation/bech32.d.ts.map +0 -1
  218. package/dist/key-derivation/bech32.js +0 -86
  219. package/dist/key-derivation/bip32.d.ts +0 -17
  220. package/dist/key-derivation/bip32.d.ts.map +0 -1
  221. package/dist/key-derivation/bip32.js +0 -41
  222. package/dist/key-derivation/bip39.d.ts +0 -22
  223. package/dist/key-derivation/bip39.d.ts.map +0 -1
  224. package/dist/key-derivation/bip39.js +0 -56
  225. package/dist/key-derivation/bytes.d.ts +0 -19
  226. package/dist/key-derivation/bytes.d.ts.map +0 -1
  227. package/dist/key-derivation/bytes.js +0 -92
  228. package/dist/key-derivation/hash.d.ts +0 -3
  229. package/dist/key-derivation/hash.d.ts.map +0 -1
  230. package/dist/key-derivation/hash.js +0 -10
  231. package/dist/key-derivation/index.d.ts +0 -8
  232. package/dist/key-derivation/index.d.ts.map +0 -1
  233. package/dist/key-derivation/index.js +0 -7
  234. package/dist/key-derivation/wallet-node.d.ts +0 -45
  235. package/dist/key-derivation/wallet-node.d.ts.map +0 -1
  236. package/dist/key-derivation/wallet-node.js +0 -109
  237. package/dist/state/ciphertext-store.d.ts +0 -12
  238. package/dist/state/ciphertext-store.d.ts.map +0 -1
  239. package/dist/state/ciphertext-store.js +0 -25
  240. package/dist/state/hydrator.d.ts +0 -16
  241. package/dist/state/hydrator.d.ts.map +0 -1
  242. package/dist/state/hydrator.js +0 -18
  243. package/dist/state/job-store.d.ts +0 -12
  244. package/dist/state/job-store.d.ts.map +0 -1
  245. package/dist/state/job-store.js +0 -118
  246. package/dist/state/jobs.d.ts +0 -50
  247. package/dist/state/jobs.d.ts.map +0 -1
  248. package/dist/state/jobs.js +0 -1
  249. package/dist/state/leaf-store.d.ts +0 -17
  250. package/dist/state/leaf-store.d.ts.map +0 -1
  251. package/dist/state/leaf-store.js +0 -35
  252. package/dist/state/merkle-tree.d.ts +0 -34
  253. package/dist/state/merkle-tree.d.ts.map +0 -1
  254. package/dist/state/merkle-tree.js +0 -104
  255. package/dist/state/note-store.d.ts +0 -37
  256. package/dist/state/note-store.d.ts.map +0 -1
  257. package/dist/state/note-store.js +0 -133
  258. package/dist/state/nullifier-store.d.ts +0 -13
  259. package/dist/state/nullifier-store.d.ts.map +0 -1
  260. package/dist/state/nullifier-store.js +0 -21
  261. package/dist/state/records.d.ts +0 -57
  262. package/dist/state/records.d.ts.map +0 -1
  263. package/dist/state/root-store.d.ts +0 -13
  264. package/dist/state/root-store.d.ts.map +0 -1
  265. package/dist/state/root-store.js +0 -30
  266. package/dist/state/store.d.ts +0 -26
  267. package/dist/state/store.d.ts.map +0 -1
  268. package/dist/state/store.js +0 -19
  269. package/dist/state.d.ts +0 -83
  270. package/dist/state.d.ts.map +0 -1
  271. package/dist/state.js +0 -171
  272. package/dist/transactions/shield.d.ts +0 -5
  273. package/dist/transactions/shield.d.ts.map +0 -1
  274. package/dist/transactions/shield.js +0 -93
  275. package/dist/transactions/types.d.ts +0 -114
  276. package/dist/transactions/types.d.ts.map +0 -1
  277. package/dist/transactions/utils.d.ts +0 -10
  278. package/dist/transactions/utils.d.ts.map +0 -1
  279. package/dist/transactions/utils.js +0 -17
  280. package/dist/utils/time.d.ts +0 -2
  281. package/dist/utils/time.d.ts.map +0 -1
  282. package/dist/utils/time.js +0 -3
  283. package/dist/utils/witness.d.ts +0 -11
  284. package/dist/utils/witness.d.ts.map +0 -1
  285. package/dist/utils/witness.js +0 -19
  286. package/errors.ts +0 -20
  287. package/index.ts +0 -17
  288. package/key-derivation/babyjubjub.ts +0 -11
  289. package/key-derivation/bech32.test.ts +0 -90
  290. package/key-derivation/bech32.ts +0 -124
  291. package/key-derivation/bip32.ts +0 -56
  292. package/key-derivation/bip39.ts +0 -76
  293. package/key-derivation/bytes.ts +0 -118
  294. package/key-derivation/hash.ts +0 -13
  295. package/key-derivation/index.ts +0 -7
  296. package/key-derivation/wallet-node.ts +0 -155
  297. package/keys.ts +0 -47
  298. package/prover/config.ts +0 -104
  299. package/prover/index.ts +0 -1
  300. package/prover/prover.integration.test.ts +0 -162
  301. package/prover/prover.test.ts +0 -309
  302. package/prover/prover.ts +0 -405
  303. package/prover/registry.test.ts +0 -90
  304. package/prover/registry.ts +0 -82
  305. package/schema.ts +0 -17
  306. package/setup-artifacts.sh +0 -57
  307. package/state/index.ts +0 -2
  308. package/state/merkle/hydrator.ts +0 -69
  309. package/state/merkle/index.ts +0 -12
  310. package/state/merkle/merkle-tree.test.ts +0 -50
  311. package/state/merkle/merkle-tree.ts +0 -163
  312. package/state/store/ciphertext-store.ts +0 -28
  313. package/state/store/index.ts +0 -24
  314. package/state/store/job-store.ts +0 -162
  315. package/state/store/jobs.ts +0 -64
  316. package/state/store/leaf-store.ts +0 -39
  317. package/state/store/note-store.ts +0 -177
  318. package/state/store/nullifier-store.ts +0 -39
  319. package/state/store/records.ts +0 -61
  320. package/state/store/root-store.ts +0 -34
  321. package/state/store/store.ts +0 -25
  322. package/state.test.ts +0 -235
  323. package/storage/index.ts +0 -3
  324. package/storage/indexeddb.test.ts +0 -99
  325. package/storage/indexeddb.ts +0 -235
  326. package/storage/memory.test.ts +0 -59
  327. package/storage/memory.ts +0 -93
  328. package/transactions/deposit.test.ts +0 -160
  329. package/transactions/deposit.ts +0 -227
  330. package/transactions/index.ts +0 -20
  331. package/transactions/note-sync.test.ts +0 -155
  332. package/transactions/note-sync.ts +0 -452
  333. package/transactions/reconcile.ts +0 -73
  334. package/transactions/transact.test.ts +0 -451
  335. package/transactions/transact.ts +0 -811
  336. package/transactions/types.ts +0 -141
  337. package/tsconfig.json +0 -14
  338. package/types/global.d.ts +0 -15
  339. package/types.ts +0 -24
  340. package/utils/async.ts +0 -15
  341. package/utils/bigint.ts +0 -34
  342. package/utils/crypto.test.ts +0 -69
  343. package/utils/crypto.ts +0 -58
  344. package/utils/json-codec.ts +0 -38
  345. package/utils/polling.ts +0 -6
  346. package/utils/signature.ts +0 -16
  347. package/utils/validators.test.ts +0 -64
  348. package/utils/validators.ts +0 -86
  349. /package/dist/{transactions → history}/types.js +0 -0
  350. /package/dist/{state/records.js → transactions/types/deposit.js} +0 -0
@@ -0,0 +1,2 @@
1
+ export * from "./types.js";
2
+ export * from "./service.js";
@@ -0,0 +1,46 @@
1
+ import type { JobKind, JobRecord, JobStatus } from "../state/index.js";
2
+ import type { NoteRecord } from "../state/store/records.js";
3
+ import type { HistoryEntry } from "./types.js";
4
+ type HistoryStateStore = {
5
+ listNotes(options?: {
6
+ chainId?: number;
7
+ mpk?: string;
8
+ token?: string;
9
+ includeSpent?: boolean;
10
+ }): Promise<NoteRecord[]>;
11
+ listJobs(filter?: {
12
+ kind?: JobKind;
13
+ statuses?: JobStatus[];
14
+ }): Promise<JobRecord[]>;
15
+ putHistoryEntry(entry: HistoryEntry): Promise<void>;
16
+ commitHistorySnapshot(options: {
17
+ chainId: number;
18
+ mpk: string;
19
+ }): Promise<void>;
20
+ hasHistorySnapshot(options: {
21
+ chainId: number;
22
+ mpk: string;
23
+ }): Promise<boolean>;
24
+ listHistoryEntries(options: {
25
+ chainId: number;
26
+ mpk: string;
27
+ }): Promise<HistoryEntry[]>;
28
+ clearHistoryEntries(options: {
29
+ chainId: number;
30
+ mpk: string;
31
+ }): Promise<void>;
32
+ };
33
+ export declare function createHistoryService(stateStore: HistoryStateStore): {
34
+ rebuildHistory(params: {
35
+ chainId: number;
36
+ mpk: string;
37
+ }): Promise<void>;
38
+ getHistory(params: {
39
+ chainId: number;
40
+ mpk: string;
41
+ force?: boolean;
42
+ includeSelfSends?: boolean;
43
+ }): Promise<HistoryEntry[]>;
44
+ };
45
+ export {};
46
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../history/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,YAAY,CAAC;AAE3E,KAAK,iBAAiB,GAAG;IACvB,SAAS,CAAC,OAAO,CAAC,EAAE;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;KACxB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACzB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,qBAAqB,CAAC,OAAO,EAAE;QAC7B,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACb,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,kBAAkB,CAAC,OAAO,EAAE;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACb,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrB,kBAAkB,CAAC,OAAO,EAAE;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACb,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5B,mBAAmB,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E,CAAC;AA6OF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,iBAAiB;2BA8IjC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;uBAmBpC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B;EA2CJ"}
@@ -0,0 +1,354 @@
1
+ import { ensureChainId, ensureMpk } from "../utils/validators.js";
2
+ function addByToken(totals, token, delta) {
3
+ totals.set(token, (totals.get(token) ?? 0n) + delta);
4
+ }
5
+ function maxTimestamp(notes, field) {
6
+ let max = 0;
7
+ for (const note of notes) {
8
+ const timestamp = note[field];
9
+ if (timestamp !== undefined)
10
+ max = Math.max(max, timestamp);
11
+ }
12
+ return max > 0 ? max : undefined;
13
+ }
14
+ const STATUS_PRIORITY = {
15
+ failed: 3,
16
+ pending: 2,
17
+ confirmed: 1,
18
+ };
19
+ function convertJobStatus(jobStatus) {
20
+ if (jobStatus === "failed" || jobStatus === "dead")
21
+ return "failed";
22
+ if (jobStatus === "pending" ||
23
+ jobStatus === "submitted" ||
24
+ jobStatus === "broadcasting")
25
+ return "pending";
26
+ return "confirmed";
27
+ }
28
+ function mergeStatus(prev, next) {
29
+ if (!prev)
30
+ return next;
31
+ return STATUS_PRIORITY[next] > STATUS_PRIORITY[prev] ? next : prev;
32
+ }
33
+ function computeEntryId(params) {
34
+ return `${params.chainId}:${params.mpk}:${params.txHash}:${params.kind}`;
35
+ }
36
+ function groupNotesByTransaction(notes) {
37
+ const byTx = new Map();
38
+ const ensureGroup = (txHash) => {
39
+ const existing = byTx.get(txHash);
40
+ if (existing)
41
+ return existing;
42
+ const next = {
43
+ created: [],
44
+ spent: [],
45
+ createdEventType: undefined,
46
+ };
47
+ byTx.set(txHash, next);
48
+ return next;
49
+ };
50
+ for (const note of notes) {
51
+ if (note.createdTxHash) {
52
+ const group = ensureGroup(note.createdTxHash);
53
+ group.created.push(note);
54
+ group.createdEventType ??= note.createdEventType;
55
+ }
56
+ if (note.spentTxHash) {
57
+ const group = ensureGroup(note.spentTxHash);
58
+ group.spent.push(note);
59
+ }
60
+ }
61
+ return byTx;
62
+ }
63
+ function resolveJobStatuses(jobs, chainId, mpk) {
64
+ const statusByTxHash = new Map();
65
+ for (const job of jobs) {
66
+ if (job.chainId !== chainId)
67
+ continue;
68
+ if (job.mpk && job.mpk !== mpk)
69
+ continue;
70
+ const txHash = job.txHash ?? undefined;
71
+ if (!txHash)
72
+ continue;
73
+ const status = convertJobStatus(job.status);
74
+ statusByTxHash.set(txHash, mergeStatus(statusByTxHash.get(txHash), status));
75
+ }
76
+ return statusByTxHash;
77
+ }
78
+ function aggregateAmounts(group) {
79
+ const createdTotals = new Map();
80
+ const spentTotals = new Map();
81
+ for (const note of group.created) {
82
+ addByToken(createdTotals, note.token, BigInt(note.value));
83
+ }
84
+ for (const note of group.spent) {
85
+ addByToken(spentTotals, note.token, BigInt(note.value));
86
+ }
87
+ const tokens = new Set([
88
+ ...createdTotals.keys(),
89
+ ...spentTotals.keys(),
90
+ ]);
91
+ const netByToken = new Map();
92
+ let hasNetChange = false;
93
+ for (const token of tokens) {
94
+ const created = createdTotals.get(token) ?? 0n;
95
+ const spent = spentTotals.get(token) ?? 0n;
96
+ const net = created - spent;
97
+ netByToken.set(token, net);
98
+ if (net !== 0n)
99
+ hasNetChange = true;
100
+ }
101
+ return { createdTotals, spentTotals, netByToken, hasNetChange };
102
+ }
103
+ function classifyTransaction(group, amounts) {
104
+ const isSelfSend = group.spent.length > 0 && !amounts.hasNetChange;
105
+ if (isSelfSend) {
106
+ return "SelfSend";
107
+ }
108
+ else if (group.spent.length > 0) {
109
+ return "Send";
110
+ }
111
+ else if (group.created.length > 0) {
112
+ return group.createdEventType === "deposit" ? "Deposit" : "Receive";
113
+ }
114
+ return null;
115
+ }
116
+ function computeFinalAmounts(kind, amounts) {
117
+ const finalTotals = new Map();
118
+ const tokens = new Set([
119
+ ...amounts.createdTotals.keys(),
120
+ ...amounts.spentTotals.keys(),
121
+ ]);
122
+ if (kind === "SelfSend") {
123
+ for (const token of tokens)
124
+ finalTotals.set(token, 0n);
125
+ }
126
+ else if (kind === "Send" || kind === "Withdraw") {
127
+ for (const [token, net] of amounts.netByToken.entries()) {
128
+ if (net < 0n)
129
+ finalTotals.set(token, net);
130
+ }
131
+ }
132
+ else {
133
+ for (const [token, net] of amounts.netByToken.entries()) {
134
+ if (net > 0n)
135
+ finalTotals.set(token, net);
136
+ }
137
+ }
138
+ return finalTotals;
139
+ }
140
+ function selectTimestamp(kind, group) {
141
+ if (kind === "Deposit" || kind === "Receive") {
142
+ return maxTimestamp(group.created, "createdAt");
143
+ }
144
+ else if (kind === "Send" || kind === "SelfSend" || kind === "Withdraw") {
145
+ return (maxTimestamp(group.spent, "spentAt") ??
146
+ maxTimestamp(group.created, "createdAt"));
147
+ }
148
+ return undefined;
149
+ }
150
+ function buildHistoryEntry(params) {
151
+ return {
152
+ id: computeEntryId({
153
+ chainId: params.chainId,
154
+ mpk: params.mpk,
155
+ txHash: params.txHash,
156
+ kind: params.kind,
157
+ }),
158
+ chainId: params.chainId,
159
+ mpk: params.mpk,
160
+ txHash: params.txHash,
161
+ kind: params.kind,
162
+ status: params.status,
163
+ timestamp: params.timestamp,
164
+ amounts: [...params.finalAmounts.entries()].map(([token, delta]) => ({
165
+ token,
166
+ delta: delta.toString(),
167
+ })),
168
+ details: {
169
+ createdNoteCount: params.group.created.length,
170
+ spentNoteCount: params.group.spent.length,
171
+ createdEventType: params.group.createdEventType ?? "unknown",
172
+ },
173
+ };
174
+ }
175
+ export function createHistoryService(stateStore) {
176
+ // Track pending rebuilds to prevent concurrent execution
177
+ const pendingRebuilds = new Map();
178
+ async function computeHistory(params) {
179
+ ensureChainId(params.chainId);
180
+ ensureMpk(params.mpk);
181
+ // Fetch data
182
+ const notes = await stateStore.listNotes({
183
+ chainId: params.chainId,
184
+ mpk: params.mpk,
185
+ includeSpent: true,
186
+ });
187
+ const jobs = await stateStore.listJobs({
188
+ statuses: [
189
+ "pending",
190
+ "submitted",
191
+ "broadcasting",
192
+ "failed",
193
+ "dead",
194
+ "succeeded",
195
+ ],
196
+ });
197
+ // Group notes by transaction hash
198
+ const byTx = groupNotesByTransaction(notes);
199
+ // Resolve job statuses for each transaction
200
+ const statusByTxHash = resolveJobStatuses(jobs, params.chainId, params.mpk);
201
+ const entries = [];
202
+ const confirmedTxHashes = new Set();
203
+ // Process each transaction group
204
+ for (const [txHash, group] of byTx.entries()) {
205
+ if (group.created.length === 0 && group.spent.length === 0)
206
+ continue;
207
+ // Aggregate amounts and compute net deltas
208
+ const amounts = aggregateAmounts(group);
209
+ // Classify transaction type
210
+ const kind = classifyTransaction(group, amounts);
211
+ if (!kind)
212
+ continue;
213
+ // Compute final amounts to display
214
+ const finalAmounts = computeFinalAmounts(kind, amounts);
215
+ if (finalAmounts.size === 0)
216
+ continue;
217
+ // Select appropriate timestamp
218
+ const timestamp = selectTimestamp(kind, group);
219
+ // Build history entry
220
+ const entry = buildHistoryEntry({
221
+ chainId: params.chainId,
222
+ mpk: params.mpk,
223
+ txHash,
224
+ kind,
225
+ status: statusByTxHash.get(txHash) ?? "confirmed",
226
+ timestamp,
227
+ finalAmounts,
228
+ group,
229
+ });
230
+ confirmedTxHashes.add(txHash);
231
+ entries.push(entry);
232
+ }
233
+ // Add pending job entries for transactions not yet indexed
234
+ for (const job of jobs) {
235
+ if (job.chainId !== params.chainId)
236
+ continue;
237
+ if (job.mpk && job.mpk !== params.mpk)
238
+ continue;
239
+ const txHash = job.txHash ?? undefined;
240
+ if (!txHash)
241
+ continue;
242
+ if (confirmedTxHashes.has(txHash))
243
+ continue;
244
+ if (!job.historyPreview)
245
+ continue;
246
+ if (job.status === "succeeded")
247
+ continue;
248
+ const status = job.status === "failed" || job.status === "dead" ? "failed" : "pending";
249
+ entries.push({
250
+ id: computeEntryId({
251
+ chainId: params.chainId,
252
+ mpk: params.mpk,
253
+ txHash,
254
+ kind: job.historyPreview.kind,
255
+ }),
256
+ chainId: params.chainId,
257
+ mpk: params.mpk,
258
+ txHash,
259
+ kind: job.historyPreview.kind,
260
+ status,
261
+ timestamp: job.createdAt,
262
+ amounts: job.historyPreview.amounts,
263
+ details: {
264
+ source: "job",
265
+ jobKind: job.kind,
266
+ },
267
+ });
268
+ }
269
+ // Sort by timestamp descending
270
+ entries.sort((a, b) => {
271
+ const at = a.timestamp ?? 0;
272
+ const bt = b.timestamp ?? 0;
273
+ if (at !== bt)
274
+ return bt - at;
275
+ return b.txHash.localeCompare(a.txHash);
276
+ });
277
+ // Filter self-sends if needed (unified filtering point)
278
+ return params.includeSelfSends
279
+ ? entries
280
+ : entries.filter((e) => e.kind !== "SelfSend");
281
+ }
282
+ async function computeAndPersist(params) {
283
+ // Always compute with self-sends included for complete storage
284
+ const allEntries = await computeHistory({
285
+ chainId: params.chainId,
286
+ mpk: params.mpk,
287
+ includeSelfSends: true,
288
+ });
289
+ await stateStore.clearHistoryEntries({
290
+ chainId: params.chainId,
291
+ mpk: params.mpk,
292
+ });
293
+ await Promise.all(allEntries.map((entry) => stateStore.putHistoryEntry(entry)));
294
+ await stateStore.commitHistorySnapshot({
295
+ chainId: params.chainId,
296
+ mpk: params.mpk,
297
+ });
298
+ }
299
+ return {
300
+ async rebuildHistory(params) {
301
+ const rebuildKey = `${params.chainId}:${params.mpk}`;
302
+ // If a rebuild is already in progress, wait for it instead of starting a new one
303
+ const existing = pendingRebuilds.get(rebuildKey);
304
+ if (existing) {
305
+ return existing;
306
+ }
307
+ // Start a new rebuild and track it
308
+ const rebuildPromise = computeAndPersist(params).finally(() => {
309
+ // Clean up when done
310
+ pendingRebuilds.delete(rebuildKey);
311
+ });
312
+ pendingRebuilds.set(rebuildKey, rebuildPromise);
313
+ return rebuildPromise;
314
+ },
315
+ async getHistory(params) {
316
+ ensureChainId(params.chainId);
317
+ ensureMpk(params.mpk);
318
+ // If rebuild in progress, wait for it
319
+ const rebuildKey = `${params.chainId}:${params.mpk}`;
320
+ const pendingRebuild = pendingRebuilds.get(rebuildKey);
321
+ if (pendingRebuild) {
322
+ await pendingRebuild;
323
+ }
324
+ if (params.force) {
325
+ await computeAndPersist({
326
+ chainId: params.chainId,
327
+ mpk: params.mpk,
328
+ });
329
+ }
330
+ else {
331
+ // Check if we have persisted history
332
+ const hasSnapshot = await stateStore.hasHistorySnapshot({
333
+ chainId: params.chainId,
334
+ mpk: params.mpk,
335
+ });
336
+ if (!hasSnapshot) {
337
+ // First time - compute and persist
338
+ await computeAndPersist({
339
+ chainId: params.chainId,
340
+ mpk: params.mpk,
341
+ });
342
+ }
343
+ }
344
+ // Always read from storage
345
+ const stored = await stateStore.listHistoryEntries({
346
+ chainId: params.chainId,
347
+ mpk: params.mpk,
348
+ });
349
+ return params.includeSelfSends
350
+ ? stored
351
+ : stored.filter((e) => e.kind !== "SelfSend");
352
+ },
353
+ };
354
+ }
@@ -0,0 +1,21 @@
1
+ export type HistoryKind = "Deposit" | "Receive" | "Send" | "SelfSend" | "Withdraw";
2
+ export type HistoryAmount = {
3
+ token: string;
4
+ /** Signed amount delta as a base-10 bigint string (positive receive, negative send). */
5
+ delta: string;
6
+ };
7
+ export type HistoryStatus = "confirmed" | "pending" | "failed";
8
+ export type HistoryEntry = {
9
+ /** Stable-ish identifier for de-duplication within a single SDK session. */
10
+ id: string;
11
+ chainId: number;
12
+ mpk: string;
13
+ txHash: string;
14
+ kind: HistoryKind;
15
+ status: HistoryStatus;
16
+ /** Timestamp in ms when known. */
17
+ timestamp?: number;
18
+ amounts: HistoryAmount[];
19
+ details?: Record<string, unknown>;
20
+ };
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../history/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,SAAS,GACT,MAAM,GACN,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG;IACzB,4EAA4E;IAC5E,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from "./constants.js";
1
2
  export * from "./types.js";
2
3
  export * from "./errors.js";
3
4
  export * from "./keys.js";
@@ -7,12 +8,18 @@ export * from "./core.js";
7
8
  export * from "./state/index.js";
8
9
  export * from "./utils/validators.js";
9
10
  export * from "./utils/bigint.js";
10
- export * from "./account/zkAccount.js";
11
- export * from "./key-derivation/index.js";
11
+ export * from "./utils/secure-memory.js";
12
+ export * from "./utils/amounts.js";
13
+ export * from "./utils/notes.js";
14
+ export * from "./utils/format.js";
15
+ export * from "./account/account.js";
16
+ export * from "./keys/index.js";
17
+ export * from "./history/index.js";
12
18
  export * from "./transactions/index.js";
13
- export { createJobReconciler } from "./transactions/reconcile.js";
14
- export { serviceConfig } from "./config.js";
15
- export type { ServiceConfig } from "./config.js";
19
+ export { createServiceConfig, fetchEnvironmentConfig } from "./config.js";
20
+ export type { Environment, EnvironmentConfig, ServiceConfig, } from "./config.js";
16
21
  export * from "./clients/broadcaster.js";
17
22
  export * from "./clients/indexer.js";
23
+ export { HttpError } from "./clients/http.js";
24
+ export * from "./crypto-adapters/index.js";
18
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1E,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,cAAc,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ export * from "./constants.js";
1
2
  export * from "./types.js";
2
3
  export * from "./errors.js";
3
4
  export * from "./keys.js";
@@ -7,10 +8,16 @@ export * from "./core.js";
7
8
  export * from "./state/index.js";
8
9
  export * from "./utils/validators.js";
9
10
  export * from "./utils/bigint.js";
10
- export * from "./account/zkAccount.js";
11
- export * from "./key-derivation/index.js";
11
+ export * from "./utils/secure-memory.js";
12
+ export * from "./utils/amounts.js";
13
+ export * from "./utils/notes.js";
14
+ export * from "./utils/format.js";
15
+ export * from "./account/account.js";
16
+ export * from "./keys/index.js";
17
+ export * from "./history/index.js";
12
18
  export * from "./transactions/index.js";
13
- export { createJobReconciler } from "./transactions/reconcile.js";
14
- export { serviceConfig } from "./config.js";
19
+ export { createServiceConfig, fetchEnvironmentConfig } from "./config.js";
15
20
  export * from "./clients/broadcaster.js";
16
21
  export * from "./clients/indexer.js";
22
+ export { HttpError } from "./clients/http.js";
23
+ export * from "./crypto-adapters/index.js";
@@ -0,0 +1,13 @@
1
+ export type Chain = {
2
+ type: number;
3
+ id: number;
4
+ };
5
+ export type AddressData = {
6
+ masterPublicKey: bigint;
7
+ viewingPublicKey: Uint8Array;
8
+ chain?: Chain;
9
+ version?: number;
10
+ };
11
+ export declare function encodeAddress(data: AddressData): string;
12
+ export declare function decodeAddress(address: string): AddressData;
13
+ //# sourceMappingURL=address.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../keys/address.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AACjD,MAAM,MAAM,WAAW,GAAG;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,UAAU,CAAC;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAgCF,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAUvD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAqB1D"}
@@ -0,0 +1,55 @@
1
+ import { bech32m } from "@scure/base";
2
+ import { ValidationError } from "../errors.js";
3
+ import { FieldSize, Hex } from "./hex.js";
4
+ const VERSION = 1;
5
+ const LIMIT = 127;
6
+ const ALL_CHAINS = "ffffffffffffffff";
7
+ const PREFIX = "0zk";
8
+ const SALT = new TextEncoder().encode("unlink");
9
+ function xorWithSalt(hex) {
10
+ const bytes = Hex.toBytes(hex);
11
+ const result = new Uint8Array(bytes.length);
12
+ for (let i = 0; i < bytes.length; i++)
13
+ result[i] = bytes[i] ^ SALT[i % SALT.length];
14
+ return Hex.fromBytes(result);
15
+ }
16
+ function chainToHex(chain) {
17
+ if (!chain)
18
+ return ALL_CHAINS;
19
+ return ((chain.type & 0xff).toString(16).padStart(2, "0") +
20
+ BigInt(chain.id).toString(16).padStart(14, "0"));
21
+ }
22
+ function hexToChain(hex) {
23
+ if (hex === ALL_CHAINS)
24
+ return undefined;
25
+ return {
26
+ type: parseInt(hex.slice(0, 2), 16),
27
+ id: parseInt(hex.slice(2), 16),
28
+ };
29
+ }
30
+ export function encodeAddress(data) {
31
+ const ver = (data.version ?? VERSION).toString(16).padStart(2, "0");
32
+ const mpk = Hex.fromBigInt(data.masterPublicKey, FieldSize.SCALAR);
33
+ const vpk = Hex.padToSize(data.viewingPublicKey, FieldSize.SCALAR);
34
+ const net = xorWithSalt(chainToHex(data.chain));
35
+ return bech32m.encode(PREFIX, bech32m.toWords(Hex.toBytes(`${ver}${mpk}${net}${vpk}`)), LIMIT);
36
+ }
37
+ export function decodeAddress(address) {
38
+ if (!address)
39
+ throw new ValidationError("No address to decode");
40
+ const decoded = bech32m.decode(address, LIMIT);
41
+ if (decoded.prefix !== PREFIX)
42
+ throw new ValidationError("Invalid address prefix");
43
+ const hex = Hex.encode(bech32m.fromWords(decoded.words));
44
+ if (hex.length !== 146)
45
+ throw new ValidationError("Incorrect address payload length");
46
+ const version = parseInt(hex.slice(0, 2), 16);
47
+ if (version !== VERSION)
48
+ throw new ValidationError("Incorrect address version");
49
+ return {
50
+ version,
51
+ masterPublicKey: Hex.toBigInt(hex.slice(2, 66)),
52
+ viewingPublicKey: Hex.toBytes(hex.slice(82, 146)),
53
+ chain: hexToChain(xorWithSalt(hex.slice(66, 82))),
54
+ };
55
+ }
@@ -0,0 +1,37 @@
1
+ export type SpendingPublicKey = [bigint, bigint];
2
+ export type SpendingKeyPair = {
3
+ privateKey: Uint8Array;
4
+ pubkey: SpendingPublicKey;
5
+ };
6
+ export type ViewingKeyPair = {
7
+ privateKey: Uint8Array;
8
+ pubkey: Uint8Array;
9
+ };
10
+ export type AccountKeys = {
11
+ spending: SpendingKeyPair;
12
+ viewing: ViewingKeyPair;
13
+ nullifyingKey: bigint;
14
+ masterPublicKey: bigint;
15
+ };
16
+ /**
17
+ * Derive spending key pair (BabyJubJub) for an account.
18
+ */
19
+ export declare function deriveSpendingKeyPair(seed: Uint8Array, index: number): SpendingKeyPair;
20
+ /**
21
+ * Derive viewing key pair (Ed25519) for an account.
22
+ */
23
+ export declare function deriveViewingKeyPair(seed: Uint8Array, index: number): Promise<ViewingKeyPair>;
24
+ /**
25
+ * Compute nullifying key from viewing private key using Poseidon hash.
26
+ */
27
+ export declare function computeNullifyingKey(viewingPrivateKey: Uint8Array): bigint;
28
+ /**
29
+ * Compute master public key from spending public key and nullifying key.
30
+ * MPK = Poseidon(spendingPubkey[0], spendingPubkey[1], nullifyingKey)
31
+ */
32
+ export declare function computeMasterPublicKey(spendingPubkey: SpendingPublicKey, nullifyingKey: bigint): bigint;
33
+ /**
34
+ * Derive all account keys from a seed.
35
+ */
36
+ export declare function deriveAccountKeys(seed: Uint8Array, index: number): Promise<AccountKeys>;
37
+ //# sourceMappingURL=derive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../keys/derive.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjD,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;CAC3B,CAAC;AACF,MAAM,MAAM,cAAc,GAAG;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAE5E,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAwDF;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,GACZ,eAAe,CAKjB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAKzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,UAAU,GAAG,MAAM,CAK1E;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,iBAAiB,EACjC,aAAa,EAAE,MAAM,GACpB,MAAM,CAER;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,CAUtB"}